#include <exec/exec.h>
#include <dos/dos.h>
#include <libraries/dos.h>
#include <devices/timer.h>
#include <intuition/intuitionbase.h>
#include <stdio.h>
#include <stdlib.h>
#include "dh1:source/doors/romconf/doorheader.h"
#include <proto/exec.h>
#include <proto/dos.h>
#include <string.h>
//#include <functions.h>
#define FOREVER for(;;)
#define SM sendmessage
#define HK hotkey
#define FHK Fhotkey
#define PM prompt
#define LI lineinput
#define JH_CK 500
#define JH_ExtHK 15


#define ADDBIT 1000
#define REMBIT 1001
#define QUERYBIT 1002

extern VOID Register(int node);
extern VOID ShutDown(VOID);
VOID ClosePort(void);
extern int Editfile(char Name[],int len);
extern void sendmessage(char mstring[],int nl);
extern void mciputstr(char mstring[],int nl);
extern int Download(char *s);
extern int Upload(char *s);
extern void ConOnly(char mstring[],int nl);
extern void SerOnly(char mstring[],int nl);
extern void sendMessage(char mstring[],int nl);
void MciSendStr(char mstring[],int nl);
extern int GetInfo(int cmd);
extern void PutInfo(int data,int cmd);
extern void sendchar(char mstring[], int nl);
extern void hotkey(char mstring[],char *ostring);
extern int FetchKey(void);
extern int sigkey(void);
extern char Fhotkey(void);
extern int getkey(void);
extern void Chain(char *str,int node,int opt);
extern void prompt(char mstring[],char *ostring,int len);
extern void lineinput(char mstring[],char *ostring,int len);
extern void showfile(char mstring[]);
extern void showgfile(char mstring[]);
extern void getuserstring(char *ostring,int nl);
extern void putuserstring(char *ostring,int nl);
extern int getsignal(void);
extern void FlagFile(char *string);
extern void CloseOut(void);
extern BOOL CheckToDisplay(char *s);
extern int TLock(char *str);
extern APTR GetSemaphore(void);
extern int AcsStat(int bits,int opt);
extern void end(void);
extern void LastCommand(void);
struct MsgPort *port;
struct MsgPort *replymp;
struct JHMessage *Jhmsg,*msg;
#define ANYKEY "press <RETURN> to continue"
char DoorReply[] = "AEDoorRP.000";
extern APTR GetSemaphore(void);
VOID Register(int node)
{
  ULONG portsig;
  int n1,n2,n3;
  int found=0;
  char PortName[80];
  Jhmsg=(struct JHMessage *)AllocMem(sizeof(struct JHMessage),MEMF_PUBLIC);

 if(Jhmsg==0)
  {
     printf("Not enough Memory for message structure\n");
     exit(30);
  }
  n1=n2=n3=0;
  while(n1<10)
  {
    n2=0;
    while(n2<10)
    {
      n3=0;
      while(n3<10)
      {
        DoorReply[9]=n1+'0';
        DoorReply[10]=n2+'0';
        DoorReply[11]=n3+'0';
        if(FindPort(DoorReply)) { n3++; continue; }
        found=1; break;
      }
      if(found) break;
      n2++;
    }
    if(found) break;
    n1++;
  }
  if(!found)
  {
     FreeMem(Jhmsg,sizeof(struct JHMessage));
    exit(30);
  }
  replymp=CreatePort(DoorReply,0L); strcpy(PortName,DoorReply);
  

  if(replymp==0)
  {
    printf("Couldn't create reply port\n");
    FreeMem(Jhmsg,sizeof(struct JHMessage));
    exit(30);
  }
  Jhmsg->Msg.mn_Node.ln_Type=NT_MESSAGE;
  Jhmsg->Msg.mn_Length=sizeof(struct JHMessage);
  Jhmsg->Msg.mn_ReplyPort=replymp;
  strcpy(Jhmsg->String,PortName);
  Jhmsg->Command=JH_REGISTER;
  Jhmsg->Data=2;
  Jhmsg->NodeID=-1;
  Jhmsg->LineNum=0;
  sprintf(PortName,"AEDoorPort%d",node);
  while(!(port=FindPort(PortName)));
  PutMsg(port,(struct Message *)Jhmsg);

    portsig=1<<replymp->mp_SigBit;
  
Wait(portsig);
msg=(struct JHMessage *)GetMsg((struct MsgPort *)replymp);
}

VOID ShutDown(VOID)
{
 ULONG portsig,signal;
  LastCommand();
 portsig=1<<replymp->mp_SigBit;
  Jhmsg->Command=JH_SHUTDOWN;
  PutMsg(port,(struct Message *)Jhmsg); 
  signal=Wait(portsig);
  ClosePort();
}

void ClosePort(void)
{
      while(msg=(struct JHMessage *)GetMsg((struct MsgPort *)replymp));
       DeletePort((struct MsgPort *)replymp);
       FreeMem(Jhmsg,sizeof(struct JHMessage));
}
int Editfile(char Name[],int len)
{ 
         strcpy(msg->String,Name);
         msg->Command=JH_EF;
         msg->Data=len;
         PutMsg(port,(struct Message *)Jhmsg); 
         WaitPort(replymp);
         GetMsg(replymp);
         len=msg->Data;
         if(msg->Data==-1) CloseOut();
         return(len);
}


void sendmessage(char mstring[],int nl)
{
        register int counter;
        char Temp[80];
   
        if(strlen(mstring)<80) sendMessage(mstring,0);
        else
        {
          counter=0;
          do
          {
            sprintf(Temp,"%.79s",&mstring[counter]);
            sendMessage(Temp,0);
            counter +=79;
          }while(strlen(Temp)==79);
        }
        if(nl==1){ sendMessage("",1); Jhmsg->LineNum +=1; }
        if(Jhmsg->LineNum==22)
        { hotkey(ANYKEY,Temp); 
 SM("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",0);
SM("                          ",0);
SM("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",0);
}
}
void mciputstr(char mstring[],int nl)
{
        register int counter;
        char Temp[80];
   
        if(strlen(mstring)<80) MciSendStr(mstring,0);
        else
        {
          counter=0;
          do
          {
            sprintf(Temp,"%.79s",&mstring[counter]);
            MciSendStr(Temp,0);
            counter +=79;
          }while(strlen(Temp)==79);
        }
        if(nl==1) MciSendStr("",1); 
}
int Download(char *s)
{
   strcpy(Jhmsg->String,s);
   Jhmsg->Command=ZMODEMSEND;
   PutMsg(port,(struct Message *)Jhmsg);
   WaitPort(replymp);
   GetMsg(replymp);
   if(Jhmsg->Data==0) return(0);
   if(Jhmsg->Data==1) return(1);
   if(Jhmsg->Data==-2)
   {
     CloseOut();
   }
}
int Upload(char *s)
{
   strcpy(Jhmsg->String,s);
   Jhmsg->Command=ZMODEMRECEIVE;
   PutMsg(port,(struct Message *)Jhmsg);
   WaitPort(replymp);
   GetMsg(replymp);
   if(Jhmsg->Data==0) return(0);
   if(Jhmsg->Data==1) return(1);
   if(Jhmsg->Data==-2)
   {
     CloseOut();
   }
}
void ConOnly(char mstring[],int nl)
{
  Jhmsg->Data = nl;
  Jhmsg->Command = JH_CO;
  strcpy(Jhmsg->String,mstring);
  PutMsg(port,(struct Message *)Jhmsg);
  (void)WaitPort(replymp);
  (void)GetMsg(replymp);
}
void SerOnly(char mstring[],int nl)
{
  Jhmsg->Data = nl;
  Jhmsg->Command = JH_SO;
  strcpy(Jhmsg->String,mstring);
  PutMsg(port,(struct Message *)Jhmsg);
  (void)WaitPort(replymp);
  (void)GetMsg(replymp);
}
void sendMessage(char mstring[],int nl)
{
	Jhmsg->Data = nl;
	Jhmsg->Command = JH_SM;
	strcpy(Jhmsg->String,mstring);
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
}
void MciSendStr(char mstring[],int nl)
{
	Jhmsg->Data = nl;
	Jhmsg->Command = JH_MCI;
	strcpy(Jhmsg->String,mstring);
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
}

int GetInfo(int cmd)
{
   Jhmsg->Command=cmd;
   PutMsg(port,(struct Message *)Jhmsg);
   WaitPort(replymp);
   GetMsg(replymp);
   return(msg->Data);
}
void PutInfo(int data,int cmd)
{
   Jhmsg->Command=cmd;
   Jhmsg->Data=data;
   PutMsg(port,(struct Message *)Jhmsg);
   WaitPort(replymp);
   GetMsg(replymp);
}
void sendchar(char mstring[],int nl)
{
     char temp[3];
     temp[0]=mstring[0];
     temp[1]='\0';
	Jhmsg->Data = nl;
	Jhmsg->Command = JH_SM;
     strcpy(Jhmsg->String,temp);
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
}
void hotkey(char mstring[],char *ostring)
{
        Jhmsg->LineNum=0;
	strcpy(Jhmsg->String,mstring);
	Jhmsg->Command = JH_HK;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
	strcpy(ostring,Jhmsg->String);
if(Jhmsg->Data==-1) CloseOut();
}
int FetchKey(void)
{
        Jhmsg->LineNum=0;
	Jhmsg->Command = JH_FETCHKEY;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
if(Jhmsg->Data==-1) CloseOut();
 return(Jhmsg->Command);
}
int sigkey(void)
{
	Jhmsg->Command = JH_ExtHK;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);

if(Jhmsg->Data==-1) CloseOut();
     return(Jhmsg->Command);
}
char Fhotkey(void)
{
        Jhmsg->LineNum=0;
	Jhmsg->Command = JH_HK;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
	
if(Jhmsg->Data==-1) CloseOut();
    return(*(Jhmsg->String));
}
int getkey(void)
{
        Jhmsg->LineNum=0;
	Jhmsg->Command = JH_CK;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
	if(Jhmsg->String[0]=='1') return(1); else return(0);
}

void Chain(char *str,int node,int opt)
{
  char cmd[200];
  if(opt==SHUTDOWN)
  {
    sprintf(cmd,"RUN >NIL: %s %d",str,node);
    Jhmsg->Command=CHAIN;
    PutMsg(port,(struct Message *)Jhmsg);
    (void)WaitPort(replymp);
    (void)GetMsg(replymp);
    ClosePort();
    Execute(cmd,NULL,NULL);
    
  }
  if(opt==WAIT)
  {
    sprintf(cmd,"%s %d",str,node);
    //Jhmsg->Command=CHAIN;
    //PutToPort((struct Message *)Jhmsg);
    //(void)WaitPort(replymp);
    //(void)GetMsg(replymp);
    //ClosePort();
    Execute(cmd,NULL,NULL);
    //Register(node);
    return;
  }
}

void prompt(char mstring[],char *ostring,int len)
{
        len +=1;
        Jhmsg->LineNum=0;
	strcpy(Jhmsg->String,mstring);
	Jhmsg->Data=len;
	Jhmsg->Command = JH_PM;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
	strcpy(ostring,Jhmsg->String);
if(Jhmsg->Data==-1) CloseOut();
}
void lineinput(char mstring[],char *ostring,int len)
{
        len +=1;
        Jhmsg->LineNum=0;
	strcpy(Jhmsg->String,mstring);
	Jhmsg->Data=len;
	Jhmsg->Command = JH_LI;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
	strcpy(ostring,Jhmsg->String);
if(Jhmsg->Data==-1) CloseOut();
}
void showfile(char mstring[])
{
	strcpy(Jhmsg->String,mstring);
	Jhmsg->Command = JH_SF;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
}
void showgfile(char mstring[])
{
	strcpy(Jhmsg->String,mstring);
	Jhmsg->Command = JH_SG;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
}

void getuserstring(char *ostring,int nl)
{
        Jhmsg->Command = nl;
        Jhmsg->Data=READIT;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
   strcpy(ostring,Jhmsg->String);
}
void putuserstring(char *ostring,int nl)
{
        Jhmsg->Command = nl;
        Jhmsg->Data=WRITEIT;
        strcpy(Jhmsg->String,ostring);
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
 
}
/*
struct MsgPort *CreatePort(UBYTE *name,LONG pri)
{
  int sigBit;
  struct MsgPort *mp;
  
  if((sigBit=AllocSignal(-1L))==-1)
    return(NULL);
  mp=(struct MsgPort *)
     AllocMem((ULONG)sizeof(struct MsgPort),(ULONG)MEMF_CLEAR|MEMF_PUBLIC);
  if(!mp)
  {
    FreeSignal(sigBit);
    return(NULL);
  }
  mp->mp_Node.ln_Name=name;
  mp->mp_Node.ln_Pri=pri;
  mp->mp_Node.ln_Type=NT_MSGPORT;
  mp->mp_Flags=PA_SIGNAL;
  mp->mp_SigBit=sigBit;
  mp->mp_SigTask=(struct Task *)FindTask(0L);
  if(name)
    AddPort(mp);
  else
    NewList(&(mp->mp_MsgList));
  return(mp);
}
*/
int getsignal(void)
{
  Jhmsg->Command = JH_SIGBIT;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
   return(Jhmsg->Data);
}
void FlagFile(char *string)
{
   strcpy(Jhmsg->String,string);
	Jhmsg->Command = JH_FLAGFILE;
	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
}
VOID CloseOut(void)
{
  ShutDown();
  end();
}
BOOL CheckToDisplay(char *s)
{
register int loop;
char FileName[200];
char temp[200];
getuserstring(FileName,DT_SECSTATUS);
loop=atoi(FileName);
strcpy(FileName,s);
	loop=(loop-(loop%5));
	for(; loop>2; loop-=5)
		{
		sprintf(temp,"%s%d.txt",FileName,loop);
          if(TLock(temp))
          {
            sprintf(temp,"%s%d",FileName,loop);
            showgfile(temp); return(1);
          }
          sprintf(temp,"%s%d.txt.gr",FileName,loop);
          if(TLock(temp))
          {
             sprintf(temp,"%s%d",FileName,loop);
             showgfile(temp); return(1);
          }
          sprintf(temp,"%s%d.GR1",FileName,loop);
          if(TLock(temp))
          {
             sprintf(temp,"%s%d",FileName,loop);
             showgfile(temp); return(1);
          }          
	}
     sprintf(temp,"%s.txt",FileName);
     if(TLock(temp))
     {
       showgfile(FileName); return(1);
     }
     sprintf(temp,"%s.txt.gr",FileName);
     if(TLock(temp))
     {
       showgfile(FileName); return(1);
     }
     sprintf(temp,"%s.GR1",FileName);
     if(TLock(temp))
     {
       showgfile(FileName); return(1);
     }
     return(0);
}

int TLock(char *str)
{
  long lock;
  if(lock=Lock(str,ACCESS_READ))
  {
    UnLock(lock); return(1);
  }
  return(0);
}
APTR GetSemaphore(void)
{
   Jhmsg->Command=MULTICOM;
   PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
     return(msg->Semi);
}
int AcsStat(int bits,int opt)
{
   switch(opt)
   {
     case ADDBIT:
          Jhmsg->Command=ADDBIT;
          Jhmsg->Data=bits;
          break;
     case REMBIT:
          Jhmsg->Command=REMBIT;
          Jhmsg->Data=bits;
          break;
     case QUERYBIT:
          Jhmsg->Command=QUERYBIT;
          Jhmsg->Data=bits;
          break;
     default: return(0);
   } 
   	PutMsg(port,(struct Message *)Jhmsg);
	(void)WaitPort(replymp);
	(void)GetMsg(replymp);
     return(msg->Command);
}