/*
 * Poll_TD
 *
 * USAGE: ret = 'mail/Poll_TD'(method,args,...)
 *
 * Poll_TD is an ARexx interface to TrapDoor...
 *
 * REQUIREMENTS:
 *	TrapDoor
 *	REXX:db/RunHost
 *	REXX:dos/error
 *
 * $(C): (1995, Rocco Coluccelli, Bologna)
 * $VER: Poll_TD 0.10 (07.Dec.1995)
 */

OPTIONS RESULTS

SIGNAL ON ERROR
SIGNAL ON SYNTAX
SIGNAL ON BREAK_C
SIGNAL ON HALT

/*
 *	(OPEN)
 *	(CALL,nodes,retries delay,beforecmd,aftercmd)
 *		node.1.1 | node.2.1 node.2.2 ... | node.n.1 ...
 *		retries delay
 *		before session command
 *		after session command
 *	(POLL...)
 *		Same as CALL, but close the mailer before exit...
 *	(QUIT)
 */
method = UPPER(ARG(1))

IF method = "QUIT" THEN DO
	IF SHOW('P','TRAPDOOR') THEN ADDRESS 'TRAPDOOR' '@Quit'
	CALL exit(0)
END

/*
 *	Try to run TrapDoor...
 */
ok = 'db/RunHost'('TRAPDOOR',,"ANSWER REXXNAME TRAPDOOR")

IF method = "OPEN" THEN
    EXIT ok
ELSE IF ~ok THEN CALL exit(20)


/*
 *	Is TrapDoor ready to start? ...
 */
ADDRESS 'TRAPDOOR'

'@Status S'
DO i = 1 WHILE result ~= "IDLE" & i < 120
	ADDRESS COMMAND 'Wait 1'
	'@Status S'
END
IF result ~= "IDLE" THEN CALL exit(20)

IF method = "CALL" | method = "POLL" THEN DO
	nodes = ARG(2)
	PARSE VALUE ARG(3) WITH retries delay .

	IF delay = "" THEN DO
		retries = 10; delay = 10; END

	DO UNTIL nodes = ""
		INTERPRET ARG(4)		/* Before Session */
		PARSE VAR nodes numbers "|" nodes
		ret = poll(numbers,retries,delay)
		INTERPRET ARG(5)		/* After Session */
		IF ret = 0 THEN nodes = nodes "|" numbers
		IF ret > 1 THEN CALL exit(ret)
	END
END
IF method = "POLL" THEN '@Quit'
CALL exit(0)



poll: PROCEDURE
	DO i = 1 TO ARG(2)				/* retries         */
		'Reset'						/* reset the modem */
		DO n = 1 TO WORDS(ARG(1))
			'Call' WORD(ARG(1),n)

			'Status X'; stat = result
			IF stat = 0 THEN RETURN 1
			IF FIND("5 7 9 14 16 24",stat) > 0 THEN RETURN 10
			IF FIND("10 19 23",stat) > 0 THEN RETURN 5
		END
		IF stat = 6 THEN RETURN 0
		IF stat = 18 THEN ADDRESS COMMAND 'Wait' ARG(3)
	END
	RETURN 1


break_c:
halt:
	RETURN

error:
syntax:
	errc = RC
	PARSE SOURCE infln
	CALL 'dos/error'(errc,SIGL,"TrapDoor: break on error..." || '0a'x || infln,SOURCELINE(SIGL))
	CALL exit(errc)


/*
 *	exit(0)		All done.
 *	exit(5)		WARN
 *	exit(10)	ERROR
 *	exit(20)	FAIL
 */
exit:
	IF SHOW('P','TRAPDOOR') & ARG(1) > 0 THEN ADDRESS 'TRAPDOOR' '@Quit'
	EXIT ARG(1)
