
/*
 *  TESTIPC <appname> <file> <file> <file> ...	<inputfile
 *
 *  input file format:
 *
 *  appname delay file text
 *
 */

#include <local/typedefs.h>
#include <local/ipc.h>
#include <local/xmisc.h>
#include <stdio.h>

extern int Enable_Abort;

extern PORT *OpenIPC();

char **Av;
short Ac;

main(ac, av)
char *av[];
{
    PORT *port;

    Av = av;
    Ac = ac;
    if (ac == 1) {
	puts("TESTIPC <appname> <subname> ... <subname>  <inputfile");
	puts("input file format:");
	puts("<appname> <delay-1/50ths> <subname> <text>");
	exit(1);
    }
    Enable_Abort = 0;
    if (openlibs(DRES_LIB) <= 0) {
	puts("Unable to open dres.library");
	exit(1);
    }
    port = OpenIPC(av[1], 0);
    if (port == NULL) {
	puts("unable to open port");
	closelibs(-1);
	exit(1);
    }
    printf("port: %08lx\n", port);
    {
	char apname[32];
	long delay;
	char subname[32];
	char text[64];
	char tbuf[128];
	IPCMSG msg;
	extern void handler();

	BZero(&msg, sizeof(msg));
	msg.Msg.mn_ReplyPort = CreatePort(NULL, 0);

	puts("scanf");
	while (scanf("%s %ld %s %s", apname, &delay, subname, text) == 4) {
	    printf("DO(%s %ld %s %s) ", apname, delay, subname, text);
	    fflush(stdout);
	    strcpy(tbuf, subname);
	    strcpy(tbuf+strlen(subname)+1, text);
	    msg.TBuf = (APTR)tbuf;
	    msg.TLen = strlen(subname)+strlen(text)+2;
	    DoIPC2(apname, &msg, handler, port);
	    if (msg.RFlags & IF_NOTFND) {
		if (msg.RFlags & IF_NOAPP)
		    puts("Application not found");
		else
		    puts("subname not found");
	    } else {
		if (msg.RFlags & IF_ERROR)
		    printf("Error: %s\n", msg.RBuf);
		else
		    printf("OK: %s\n", msg.RBuf);
	    }
	    FreeIPC(&msg);
	    if (delay)
		Delay(delay);
	    if (CheckPort(port))
		handler(port);
	}
	DeletePort(msg.Msg.mn_ReplyPort);
    }
    CloseIPC(port);
    closelibs(-1);
}

void
handler(port)
PORT *port;
{
    IPCMSG *msg;
    short i, j;

    while (msg = GetMsg(port)) {
	register char *ptr = (char *)msg->TBuf;
	printf("Received IPC command: %s  ", ptr);
	for (j = 0; ptr[j] && ptr[j] != ' '; ++j);
	for (i = 2; i < Ac; ++i) {
	    if (strlen(Av[i]) == j && strncmp(Av[i], ptr, j) == 0)
		break;
	}
	if (i < Ac) {
	    puts("MATCH");
	    ReplyIPC(msg, "GotIt!", 7, 0);
	} else {
	    puts("PASSED");
	    ReplyIPC(msg, "Failed", 7, IF_NOTFND);
	}
    }
}

