/* Tempest Door Code! */

//**********************
//*****  Includes  *****
//**********************

#include <proto/all.h>
#include <exec/types.h>
#include <time.h>
#include <stdio.h>
#include <ctype.h>
#include <devices/timer.h>
#include <devices/serial.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <exec/memory.h>
#include <stdarg.h>

#include <string.h>
#include <tempest/headers.h>

//************************
//*****  ProtoTypes  *****
//************************

int  DoorStart(TEXT *);
int  DOORIO(VOID);
VOID CloseStuff(VOID);


VOID Activity(BYTE,TEXT *);
VOID AlterTime(UWORD);
int  CheckKey(VOID);
int  CTRLC(VOID);
int  CursorHotKey(VOID);
VOID Editor(TEXT *,int);
ULONG FileSize(TEXT *Source);
VOID GetPaths(TEXT *,int);
VOID GetStr(TEXT *,int);
VOID GetUserTime(TEXT *);
int  GetValue(int);
int  hotkey(TEXT *);
VOID input(TEXT *,int);
VOID inputAB(TEXT *,int);
VOID LineInput(TEXT *,TEXT *,int);
VOID LineInputAB(TEXT *,TEXT *,int);
VOID LineInputHide(TEXT *,TEXT *,int);
VOID LineInputHideAB(TEXT *,TEXT *,int);
VOID MarkFile(TEXT *);
VOID LoadSystemData(VOID);
VOID LOG(TEXT *);
VOID SLOG(TEXT *);
VOID DEBUGLOG(TEXT *);
VOID USERLOG(TEXT *);
int  MORE(VOID);
int  Pause(VOID);
VOID pl(TEXT *);
VOID pl(TEXT *,...);
int  Random(int);
VOID SetValue(int,int);
VOID showfile(TEXT *);
int StringCompare(TEXT *string, TEXT *pattern);
VOID UserTime(int);
VOID WriteFile(TEXT *,TEXT *);
VOID ZmodemDownload(TEXT *);
VOID ZUpload(VOID);

//*********************
//*****  Structs  *****
//*********************

 struct MyMessage
  {
   struct Message Msg; // for Exec message routines
   ULONG  Command;     // Command to be executed.

   TEXT   *text1,
          *text2,
          *text3;
   int    Value1,
          Value2;
   ULONG  LongValue;
   LONGBITS Flags;
   int    carrier;
   struct User       *User;
   struct SystemData *SystemData;
   struct NodeData   *NodeData;
   struct Today      *Today;
  };

struct MyMessage send;

struct MsgPort *MyPort = NULL;
struct MyMessage *msg;
struct User *User;
struct SystemData *SystemData;
struct NodeData *NodeData;
struct Today *Today;

struct MsgPort *TempestPort;



//************************
//*****  Door Start  ***** // MUST BE INCLUDED IN ALL DOORS!
//************************
int DoorStart(TEXT *node)
{
 char string[60];
 send.carrier=0;
 sprintf(string,"%s:TEMPEST_DOOR",node);
 TempestPort=FindPort(string);
 if(TempestPort==NULL) return(int)FALSE;
 MyPort=CreateMsgPort();
 if(MyPort==NULL) return(int)FALSE;
 DOORIO(0);
 User=*&send.User;
 SystemData=*&send.SystemData;
 NodeData=*&send.NodeData;
 Today=*&send.Today;
 return(int)TRUE;
}
//********************
//*****  DoorIO  ***** // MUST BE INCLUDED IN ALL DOORS!
//********************
int DOORIO(WORD Command)
{
 if(send.carrier) return(0);
 send.Command=Command;
 send.Msg.mn_Node.ln_Type = NT_MESSAGE;
 send.Msg.mn_Length = sizeof(send);
 send.Msg.mn_ReplyPort = MyPort;
 send.carrier=0;
 PutMsg((struct MsgPort *)TempestPort,(struct Message *)&send);
 Wait(1 << MyPort->mp_SigBit);
 GetMsg(MyPort);
 if((send.carrier)&&(send.Command!=999)) CloseStuff();
 return(1);
}
//*************************
//*****  Close Stuff  ***** // MUST BE INCLUDED IN ALL DOORS!
//*************************
VOID CloseStuff(VOID)
{
 DOORIO(999);
 while(msg=(struct MyMessage *)GetMsg(MyPort)) ReplyMsg((struct Message *)msg);
 if(MyPort) DeleteMsgPort(MyPort);
 exit(0);
}


//**********************
//*****  Activity  ***** // Command 44
//**********************
VOID Activity(BYTE act,TEXT *s)
{
 send.Value1=act;
 send.text1=s;
 DOORIO(44);
}
//***********************
//*****  AlterTime  ***** // Command 41
//***********************
VOID AlterTime(UWORD opt)
{
 send.Value1=(int)opt;
 DOORIO(41);
}
//***********************
//*****  Check Key  ***** // Command 15
//***********************
int CheckKey(VOID)
{
 send.Value2=0;
 DOORIO(15);
 return(send.Value2);
}
//************************
//*****  Copy File  ***** // Command 76
//************************
VOID CopyFile(TEXT *Source,TEXT *Destination)
{
 send.text1=Source;
 send.text2=Destination;
 DOORIO(76);
}
//*************************
//*****  CTRLC CHECK  ***** // Command 10
//*************************
int CTRLC(VOID)
{
 DOORIO(10);
 return(send.Value1);
}
//***************************
//*****  Cursor HotKey  ***** // Command 17
//***************************
int CursorHotKey(VOID)
{
 DOORIO(17);
 return(send.Value1);
}
//********************
//*****  Editor  ***** // Command 73
//********************
VOID Editor(TEXT *Filename,int maxlength)
{
 send.Value1=maxlength;
 send.text1=Filename;
 DOORIO(73);
}
//***********************
//*****  File Size  ***** // Command 78
//***********************
ULONG FileSize(TEXT *Source)
{
 send.text1=Source;
 DOORIO(78);
 return(send.LongValue);
}
//***********************
//*****  Get Paths  ***** // Command 30
//***********************
VOID GetPaths(TEXT *s,int opt)
{
 send.Value1=opt;
 strcpy(s,"");
 send.text1=s;
 DOORIO(30);
}
//*********************************
//*****  GetStr (Get String)  ***** // Command 33
//*********************************
VOID GetStr(TEXT *s,int opt)
{
 send.Value1=opt;
 strcpy(s,"");
 send.text1=s;
 DOORIO(33);
}
//***************************
//*****  Get User Time  ***** // Command 31
//***************************
VOID GetUserTime(TEXT *s)
{
 send.text1=s;
 DOORIO(31);
}
//***********************
//*****  Get Value  ***** // Command 34
//***********************
int GetValue(int opt)
{
 send.Value1=opt;
 DOORIO(34);
 return(send.Value2);
}
//*********************
//*****  Hot Key  ***** // Command 16
//*********************
int hotkey(TEXT *character)
{
 send.text1=character;
 DOORIO(16);
 return((int)character[0]);
}
//****************************
//*****  Hydra Download  ***** // Command 54
//****************************

VOID HydraDownload(TEXT *mstring)
{
 send.text1=mstring;
 DOORIO(54);
}
//*******************
//*****  Input  ***** // Command 20
//*******************
VOID input(TEXT *mstring,int len)
{
 send.Value1=len;
 send.text1 =mstring;
 DOORIO(20);
}
//****************************
//*****  Input Ansi Bar  ***** // Command 21
//****************************
VOID inputAB(TEXT *mstring,int len)
{
 send.Value1=len;
 send.text1 =mstring;
 DOORIO(21);
}
//************************
//*****  Line Input  ***** // Command 22
//************************
VOID LineInput(TEXT *ostring,TEXT *mstring,int len)
{
 send.Value1=len;
 send.text1=mstring;
 send.text2=ostring;
 DOORIO(22);
}
//********************************
//*****  Line Input Ansi Bar ***** // Command 23
//********************************
VOID LineInputAB(TEXT *ostring,TEXT *mstring,int len)
{
 send.Value1=len;
 send.text1=mstring;
 send.text2=ostring;
 DOORIO(23);
}
//*********************************
//*****  Line Input (Hidden)  ***** // Command 24
//*********************************
VOID LineInputHide(TEXT *oldstring,TEXT *newstring,int len)
{
 send.Value1=len;
 send.text1=newstring;
 send.text2=oldstring;
 DOORIO(24);
}
//*****************************************
//*****  Line Input (Hidden) Ansi Bar ***** // Command 25
//*****************************************
VOID LineInputHideAB(TEXT *oldstring,TEXT *newstring,int len)
{
 send.Value1=len;
 send.text1=newstring;
 send.text2=oldstring;
 DOORIO(25);
}
//******************************
//*****  Load System Data  ***** // Command 74
//******************************
VOID LoadSystemData(VOID)
{
 DOORIO(74);
}
//********************************
//*****  LOG (Write to Log)  ***** // Command 60
//********************************
VOID LOG(TEXT *outstring)
{
 send.text1=outstring;
 DOORIO(60);
}
//***************************************
//*****  SLOG (Write to Sysop Log)  ***** // Command 61
//***************************************
VOID SLOG(TEXT *outstring)
{
 send.text1=outstring;
 DOORIO(61);
}
//*****************************************
//*****  de_bug (Write to debug Log)  ***** // Command 62
//*****************************************
VOID DEBUGLOG(TEXT *outstring)
{
 send.text1=outstring;
 DOORIO(62);
}
//******************************************
//*****  User Log (Write to User Log)  ***** // Command 63
//******************************************
VOID USERLOG(TEXT *outstring)
{
 send.text1=outstring;
 DOORIO(63);
}
//*****************************************
//*****  FLAG/MARK file for Download  ***** // Command 51
//*****************************************
VOID MarkFile(TEXT *flagfile)
{
 send.text1=flagfile);
 DOORIO(51);
}
//*************************
//*****  MORE PROMPT  ***** // Command 72
//*************************
int MORE(VOID)
{
 DOORIO(72);
 return(send.Value1);
}
//*******************
//*****  Pause  ***** // Command 71
//*******************
int Pause(VOID)
{
 DOORIO(71);
 return(send.Value1);
}
//*****************************
//*****  PL (Print Line)  ***** // Command 1
//*****************************
VOID pl(TEXT *string)
{
 send.text1=string;
 DOORIO(1);
}
//*****************************
//*****  PL (Print Line)  ***** // Command 1 with "%s %d",xxx,xxx) paramter support
//*****************************
VOID pl(TEXT *fmt,...)
{
 va_list args;
 TEXT s[255];
 va_start(args,fmt);
 vsprintf(s,fmt,args);
 va_end(args);
 send.text1=&s[0];
 DOORIO(1);
}
//********************
//*****  Random  ***** // Command 75
//********************
int Random(int x)
{
 send.Value1=x;
 DOORIO(75);
 return(send.Value1);
}
//*******************************
//*****  Load User Account  ***** // Command 100
//*******************************
int LoadUserAccount(struct User *hoozer,UWORD slot)
{
 send.LongValue=(ULONG)hoozer;
 send.Value1   =slot;
 DOORIO(100);
 return(send.Value1); // 0 = Loaded Ok, 1 = Error in load.
}
//*******************************
//*****  Save User Account  ***** // Command 101
//*******************************
int SaveUserAccount(struct User *hoozer,UWORD slot)
{
 send.LongValue=(ULONG)hoozer;
 send.Value1   =slot;
 DOORIO(101);
 return(send.Value1); // 0 = Saved Ok, 1 = Error in save.
}
//****************************
//*****  Find User Slot  ***** // Command 103
//****************************
int FindUserSlot(TEXT *name)
{
 send.text1=name;
 DOORIO(103);
 return(send.Value1); // Returns Slot # or 0 if it is not found.
}
//********************************
//*****  Load Catalog Entry  ***** // Command 110
//********************************
int LoadCatalogEntry(struct Catalogs *cat,ULONG Area,ULONG SubArea,UWORD Slot)
{
 send.text1    =(char *)cat;
 send.LongValue=Area;
 send.Value1   =SubArea;
 send.Value2   =Slot;
 DOORIO(110);
 return(send.Value1); // 0 = Loaded Ok, 1 = Error in load.
}
//********************************
//*****  Save Catalog Entry  ***** // Command 111
//********************************

int SaveCatalogEntry(struct Catalogs *cat,ULONG Area,ULONG SubArea,UWORD Slot)
{
 send.text1    =(char *)cat;
 send.LongValue=Area;
 send.Value1   =SubArea;
 send.Value2   =Slot;
 DOORIO(111);
 return(send.Value1); // 0 = Loaded Ok, 1 = Error in load.
}
//*********************
//*****  Set Msg  ***** // Command 90
//*********************
VOID SaveMsg(struct Letters *Letters,int Area,TEXT *FileName)
{
 send.Value1=Area;
 send.text1 =(char *)Letters;
 send.text2 =FileName;
 DOORIO(90);
}
//***********************
//*****  Set Value  ***** // Command 43
//***********************
VOID SetValue(int opt1,int opt)
{
 send.Value2=opt1;
 send.Value1=opt;
 DOORIO(43);
}
//***********************
//*****  Show File  *****  // Command 70
//***********************
VOID showfile(TEXT *file)
{
 send.text1=file;
 DOORIO(70);
}
//****************************
//*****  String Compare  ***** // Command 79
//****************************
int StringCompare(TEXT *string, TEXT *pattern)
{
 send.text1=string;
 send.text2=pattern;
 DOORIO(79);
 return(send.Value1);
}
//***********************
//*****  User Time  ***** // Command 31
//***********************
VOID UserTime(int x)
{
 send.Value1=x;
 DOORIO(31);
}
//************************
//*****  Write File  ***** // Command 69
//************************
VOID WriteFile(TEXT *file,TEXT *string)
{
 send.text1=file;
 send.text2=string;
 DOORIO(69);
}
//*****************************
//*****  Zmodem Download  ***** // Command 52
//*****************************
VOID ZmodemDownload(TEXT *file)
{
 send.text1=file;
 DOORIO(52);
}
//***************************
//*****  Zmodem Upload  ***** // Command 53
//***************************
VOID ZModemUpload(VOID)
{
 DOORIO(53);
}

    VOID ASLRequester(int Type,char *rstring,char *reqtext,char *dpath)
    {
     send.Value1 = Type;     // Which Type of Requester
     send.text1  = rstring;  // Return string (contains results of requester)
     send.text2  = reqtext;  // Requester Titlebar text
     send.text3  = dpath;    // Requester Default Path
     DOORIO(84);
    }

VOID TempesTDoor(char *pathfile)
 {
  send.text1    =(char *)pathfile;
  DOORIO(120);
 }

VOID ParagonDoor(char *pathfile)
 {
  send.text1    =(char *)pathfile;
  DOORIO(121);
 }

VOID RexxDoor(char *pathfile)
 {
  send.text1    =(char *)pathfile;
  DOORIO(122);
 }

VOID DosDoor(char *pathfile)
 {
  send.text1    =(char *)pathfile;
  DOORIO(123);
 }
