#include <intuition/intuitionbase.h>
#include <clib/rexxsyslib_protos.h>
#include <exec/exec.h>
#include <rexx/rxslib.h>
#include <rexx/storage.h>
#include <rexx/rexxio.h>
#include <rexx/errors.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos/dostags.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/alib_protos.h>
#include "sc:ae/CmodGlue/doorheader.h"
#include "sc:ae/CmodGlue/glue.h"

#define SM sendmessage
#define PM prompt
#define HK hotkey
#define GU getuserstring
#define PU putuserstring
struct IntuitionBase *IntuitionBase;
struct RexxSysBase *RexxSysBase;
struct MsgPort *MyRexxPort;
ULONG RexxSig;
void OpenRexxPort(int node);
void CheckRexxMessage();
void CloseRexx(int opt);
void RemoveRexxPort(int opt);
void end();
int node;
  struct RexxMsg *rexxmsg;
struct  MsgPort  RexxPort;
struct  RexxMsg  *OutMsg, *CreateRexxMsg();
char DoorVer[]="13";
struct rx_mes *mslist;
  char CommandLine[200];
void LastCommand(void);
int StartProcess(char *s,ULONG Stack);
void main(int argc,char *argv[]);
void main(int argc,char *argv[])
{
  char Command[200];
  if(argc==1)
  {
     printf("RexxDoor v1.4, written by Joseph Hodge\n");
     printf("\n");
     printf("This module is called by AmiExpress 1.1v+\n");
     printf("Requires: RexxMast, RX & Rexxsyslib.library\n");
     exit(0);
  }
  node=argv[1][0]-'0';
  OpenRexxPort(argv[1][0]-'0');
  Register(argv[1][0]-'0');
  node=argv[1][0]-'0';
  GU(Command,BB_TASKPRI);
  SetTaskPri(FindTask(0),(LONG)atol(Command));
  strcpy(CommandLine,argv[2]);
  sprintf(Command,"sys:rexxc/RX %s %c",CommandLine,argv[1][0]);
  StartProcess(Command,4096L);
  CheckRexxMessage();
  CloseRexx(0);
}

void end()
{
  rexxmsg->rm_Result1=10;
	
  rexxmsg->rm_Result2=0;
  ReplyMsg((struct Message *) rexxmsg);
  CloseRexx(1);
  exit(0);
}
void OpenRexxPort(int node)
{
if((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L))==NULL)
{ 
   printf("can't open intuition.library\n");
   exit(0);
}
if((RexxSysBase = (struct RexxSysBase *)OpenLibrary(RXSNAME,0)) == NULL)
	{
	puts("rexxsyslib.library not found, AREXX port disabled\n");
	}
    switch(node)
    {
      case 0: InitPort(&RexxPort,"AERexxPort0"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl0",0L); break;
      case 1: InitPort(&RexxPort,"AERexxPort1"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl1",0L); break;
      case 2: InitPort(&RexxPort,"AERexxPort2"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl2",0L); break;
      case 3: InitPort(&RexxPort,"AERexxPort3"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl3",0L); break;
      case 4: InitPort(&RexxPort,"AERexxPort4"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl4",0L); break;
      case 5: InitPort(&RexxPort,"AERexxPort5"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl5",0L); break;
      case 6: InitPort(&RexxPort,"AERexxPort6"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl6",0L); break;
      case 7: InitPort(&RexxPort,"AERexxPort7"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl7",0L); break;
      case 8: InitPort(&RexxPort,"AERexxPort8"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl8",0L); break;
      case 9: InitPort(&RexxPort,"AERexxPort9"); AddPort(&RexxPort);
              MyRexxPort=(struct MsgPort *) CreatePort("AERexxControl9",0L); break;
    }
RexxSig = 1L << MyRexxPort->mp_SigBit;

}
void CheckRexxMessage(void)
{

  char String[200];
  char Tmp[200];
  long t;
  int i;
  int cmd;
  int PromptWidth=100;
  char PutUserStr[200];
struct rx_mes *mslist2;
  strcpy(PutUserStr,"");
 
while(1)
	{
     rexxmsg=(struct RexxMsg *)WaitPort((struct MsgPort *) MyRexxPort);
	while(( rexxmsg = (struct RexxMsg *) GetMsg((struct MsgPort *) MyRexxPort)))
		{
     
                 rexxmsg->rm_Result1=0L;
                 rexxmsg->rm_Result2=0L;
		if( !strnicmp(rexxmsg->rm_Args[0],"getuser",7) )
			{
                           strcpy(String,rexxmsg->rm_Args[0]+8);
                           cmd=atoi(String);
                           GU(String,atoi(String));
                    rexxmsg->rm_Result1=0;
                    rexxmsg->rm_Result2=(long)CreateArgstring(String,(long)strlen(String));
              
                } else
               if( !strnicmp(rexxmsg->rm_Args[0],"putuser",7) )
			{
                           strcpy(String,rexxmsg->rm_Args[0]+8);
                           cmd=atoi(String);
                           PU(PutUserStr,atoi(String));
                    rexxmsg->rm_Result1=0;
                    rexxmsg->rm_Result2=0;
              
                }  else
                if( !strnicmp(rexxmsg->rm_Args[0],"ConvertToDate",13) )
			{
                           strcpy(String,rexxmsg->rm_Args[0]+14);
                           DateToString(atol(String),String);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=(long)CreateArgstring(String,(long)strlen(String));
               
              
                }  else
               if( !strnicmp(rexxmsg->rm_Args[0],"ConvertToTime",13) )
			{
                           strcpy(String,rexxmsg->rm_Args[0]+14);
                           TimeToString(atol(String),String);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=(long)CreateArgstring(String,(long)strlen(String));
               
              
                }  else
                if(!strnicmp(rexxmsg->rm_Args[0],"putinfo",7))
                {
                    strcpy(String,rexxmsg->rm_Args[0]+8);
                    PutInfo(atoi(PutUserStr),atoi(String));
                    rexxmsg->rm_Result1=0;
                    rexxmsg->rm_Result2=0;
                }else if(!strnicmp(rexxmsg->rm_Args[0],"VerRexxDoor",11))
                {
                   strcpy(String,DoorVer);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=(long)CreateArgstring(String,(long)strlen(String));
                }else
                if(!strnicmp(rexxmsg->rm_Args[0],"transmit",8))
                  {
                    strcpy(String,rexxmsg->rm_Args[0]+9); 
                    SM(String,1); 
                    rexxmsg->rm_Result1=0;
                    rexxmsg->rm_Result2=0;
                  } else
                if(!strnicmp(rexxmsg->rm_Args[0],"sendmessage",11))
                {
                  strcpy(String,rexxmsg->rm_Args[0]+12);
                  SM(String,0);
                  rexxmsg->rm_Result1=0;
                  rexxmsg->rm_Result2=0;
                  
                }else
                if(!strnicmp(rexxmsg->rm_Args[0],"EditFile",8))
                {
                  strcpy(String,rexxmsg->rm_Args[0]+9);
                  Editfile(String,atoi(PutUserStr));
                  rexxmsg->rm_Result1=0;
                  rexxmsg->rm_Result2=0;
                }
                else
                if(!strnicmp(rexxmsg->rm_Args[0],"sendstring",10))
                {
                  strcpy(String,rexxmsg->rm_Args[0]+11);
                  SM(String,0);
                  rexxmsg->rm_Result1=0;
                  rexxmsg->rm_Result2=0;
                  
                }else
             if(!strnicmp(rexxmsg->rm_Args[0],"RemoveReserved",14))
             {
                strcpy(String,rexxmsg->rm_Args[0]+15);
                i=strlen(String)-1;
                while(i>-1)
                {
                  if(String[i]=='/' || String[i]=='*' || String[i]=='?' ||
                     String[i]=='#' || String[i]==' ') String[i]='_';
                  i--;
                }
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=(long)CreateArgstring(String,(long)strlen(String));
             }else

             if(!strnicmp(rexxmsg->rm_Args[0],"getchar",7))
             {
                HK("",String);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=(long)CreateArgstring(String,(long)strlen(String));
              }else
             if(!strnicmp(rexxmsg->rm_Args[0],"showfile",8))
             {
                strcpy(String,rexxmsg->rm_Args[0]+9);
                showfile(String);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=0;
             }
             else
             if(!strnicmp(rexxmsg->rm_Args[0],"flagfile",8))
             {
                strcpy(String,rexxmsg->rm_Args[0]+9);
                FlagFile(String);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=0;
             }
             else
             if(!strnicmp(rexxmsg->rm_Args[0],"showgfile",9))
             {
                strcpy(String,rexxmsg->rm_Args[0]+10);
                showgfile(String);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=0;
             }
             else
             if(!strnicmp(rexxmsg->rm_Args[0],"PUTUSTR",7))
             {
                strcpy(PutUserStr,rexxmsg->rm_Args[0]+8);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=0;
             }
             else
             if(!strnicmp(rexxmsg->rm_Args[0],"RECEIVE",7))
             {
                PromptWidth=atoi(rexxmsg->rm_Args[0]+8)-1;
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=0;
             }else
             if(!strnicmp(rexxmsg->rm_Args[0],"QUERY",5))
             {
                strcpy(String,rexxmsg->rm_Args[0]+6);
                SM(String,0);
                PM("",String,PromptWidth);
                rexxmsg->rm_Result1=0;
                rexxmsg->rm_Result2=(long)CreateArgstring(String,(long)strlen(String));
             }else
             if(!strnicmp(rexxmsg->rm_Args[0],"SHUTDOWN",8))
             {
                ShutDown();
                ReplyMsg((struct Message *) rexxmsg);
                return;
             }
                ReplyMsg((struct Message *) rexxmsg);
                
            }
         }
}
void CloseRexx(int opt)
{
  RemoveRexxPort(opt);
  RemPort(&RexxPort);                   /* unlink it                     */
    FreePort(&RexxPort); 
  CloseLibrary((struct Library *)RexxSysBase);
  CloseLibrary((struct Library *)IntuitionBase);
}
void RemoveRexxPort(int opt)
{
  struct RexxMsg *rexxmsg;
if(MyRexxPort)
	{
	while(rexxmsg = (struct RexxMsg *) GetMsg((struct MsgPort *) MyRexxPort))
        {
          if(opt)rexxmsg->rm_Result1=10;  
	
          ReplyMsg((struct Message *) rexxmsg);
        }
	DeletePort((struct MsgPort *) MyRexxPort);
	}
}


void LastCommand(void)
{
}

struct TagItem tags[]={ {SYS_Input,0},{SYS_Output,0},{SYS_Asynch,TRUE},{NP_StackSize,0},{NP_Priority,0},{TAG_DONE,0}};

int StartProcess(char *s,ULONG Stack)
{
    tags[3].ti_Data=Stack;
    if(SystemTagList(s,tags)==-1)
    {
      return(0);
    }
    return(1);
}
