
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <dos/dos.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>

#include <clib/AMarquee_protos.h>

#include <pragmas/AMarquee_pragmas.h>

struct Library * AMarqueeBase = NULL;
struct QSession * session     = NULL;

/* Takes user input until blank line is typed */
void ProcessDebugCommands(struct QSession * session)
{
  while(1)
  {
	char debugline[500] = "\0\0\0\0\0\0\0\0";
	char * keyword, * data;
	ULONG dataLen = 0L;
	LONG res;
	
	printf("Enter your debug command now: "); fflush(stdout);
	gets(debugline);
  
	keyword = &debugline[2];
	if (data = strchr(keyword,'='))
	{
	  *data = '\0';  /* terminate the keyword */
	  data++;
	  dataLen = strlen(data)+1;
	}
	else {
	 strcpy(keyword+strlen(keyword),"\n");
	 dataLen=strlen(keyword)+1;
	}

	switch((int)(debugline[0]))
	{
	  case '\0': res=QGo(session,0L);                  break;
	  case 's':  res=QSendRawOp(session, keyword, dataLen-1); break;
	  default:   printf("Command code %c was not recognized.\n",debugline[0]); break;
	}
	printf("(Op result was %i)\n",res);
	if (debugline[0] == '\0') return;
  }
}


void CleanExit(void)
{
  if (session)      QFreeSession(session);        /* This MUST be done before we close the library! */
  if (AMarqueeBase) CloseLibrary(AMarqueeBase);  
  printf("All done.\n");
}

/* Main program */
int main(int argc, char ** argv)
{
  char * acceptFrom, * progNames;
  int port;
  
  printf("Usage Note:  AMarqueeHost [hosts=#?] [programs=#?] [port=INADDR_ANY]\n");  
  atexit(CleanExit);
  
  acceptFrom = (argc > 1) ? argv[1] : "#?";
  progNames  = (argc > 2) ? argv[2] : "#?";
  port       = (argc > 3) ? atoi(argv[3]) : 0;
  
  if ((AMarqueeBase = OpenLibrary("amarquee.library",37L)) == NULL)
  {
	 printf("Couldn't open amarquee.library v37!\n");
	 exit(RETURN_ERROR);
  }
  if ((session = QNewSocketServerSession(&port)) == NULL)
  {
	 printf("Couldn't open host session on port %i.\n",port);
	 exit(RETURN_WARN);
  }
  printf("Accepting connections from %s:%s on port %i.\n",acceptFrom, progNames,port);
  
  printf("Press CTRL-F to enter commands, or CTRL-C to quit\n");
  
  while(1)
  {
	 struct QMessage * qMsg;
	 ULONG signals = (1L << session->qMsgPort->mp_SigBit) | (SIGBREAKF_CTRL_C) | (SIGBREAKF_CTRL_F);

	 /* Wait for next message from the server */
	 signals = Wait(signals);
	 
	 if (signals & (1L << session->qMsgPort->mp_SigBit))
	 {
		while(qMsg = (struct QMessage *) GetMsg(session->qMsgPort))
		{
		  struct QRunInfo * inf = (qMsg->qm_DataLen == sizeof(struct QRunInfo)) ? (struct QRunInfo *) qMsg->qm_Data : NULL;

		  /* Handle message */
		  printf("Message %p recieved---------\n",qMsg);
		  printf("Status:       %i\n",  qMsg->qm_Status);
		  printf("Error Line:   %i\n",  qMsg->qm_ErrorLine);
		  printf("Message ID:   %i\n",  qMsg->qm_ID);
		  printf("Path:        [%s]\n", qMsg->qm_Path?qMsg->qm_Path:"<NULL>");
		  if (qMsg->qm_Data) {
				char *gh=(char *)qMsg->qm_Data;
				gh[qMsg->qm_DataLen-1]=0;
		  }

		  printf("Data:        [%s](int=%i)\n", qMsg->qm_Data?qMsg->qm_Data:((UBYTE*)"<NULL>"),qMsg->qm_Data?(*((int*)qMsg->qm_Data)):0);
		  printf("DataLen:      %lu\n", qMsg->qm_DataLen);
		  printf("ActualLen:    %lu\n", qMsg->qm_ActualLen);

		  if (inf) printf("Info: alloced:%li allowed:%li avail:%li\n",inf->qr_Alloced, inf->qr_Allowed, inf->qr_Avail); 
		  FreeQMessage(session, qMsg);
		}
	 }
	 if (signals & SIGBREAKF_CTRL_F) ProcessDebugCommands(session);
	 if (signals & SIGBREAKF_CTRL_C) break;  /* Quit if CTRL-C pressed */
  }
  /* CleanExit() called here! */
}
