/*
 * Poll
 *
 * USAGE:
 *	boolean = 'mail/Poll'(NODE/M,STOP/S)
 *
 * REQUIREMENTS:
 *	LIBS:rexxdossupport.library
 *	REXX:db/Config
 *	REXX:mail/Poll_TD
 *	REXX:mail/Poll_GMS
 *	REXX:dos/ReadBlock
 *	REXX:dos/WriteBlock
 *
 * Poll is mainly intended for using as execution module for the
 * OutBoundManager...
 *
 * $(C): (1996, Rocco Coluccelli, Bologna)
 * $VER: Poll 0.04 (14.Nov.1996)
 */

OPTIONS RESULTS

m. = ""
m.cfg_deft = ""
m.cfg_file = ARG(2)
IF ARG(2) = "" THEN m.cfg_file = "REXX:mail/Poll.cfg"

INTERPRET 'db/Config'("LOAD",m.cfg_file,m.cfg_deft)

/*
 *	Phone numbers are rejected...
 */
IF ~ReadArgs(ARG(1),"NODE/M,STOP/S") THEN RETURN 0
CALL PRAGMA('D',cfg.pop.1)	/* Outbound-dir is the current-dir */
CALL PRAGMA('W','N')		/* Disable system request */

file. = ""
DO n = 0 FOR node.count
	IF EXISTS(node.n) THEN DO
		node = TRANSLATE(FilePart(node.n)," ","."); file.n = node.n; END
	ELSE node = TRANSLATE(node.n,"   ",":/.")

	PARSE VAR node zn nt hb .
	node.n = zn":"nt"/"hb".0"
	file = zn"."nt"."hb".0.INF"
	IF EXISTS(file) THEN DO
		INTERPRET 'db/Config'("LOAD",file); node.n = cfg.db_aka; END
END
file.count = node.count

/*
 *	type = External, Trapdoor, Gms (0,1,2)
 *	mode = Node by Node, Node with Aka, Do all Nodes, Shedule (0,1,2,3)
 */
type = cfg.cyc.1; mode = cfg.cyc.2
IF type > 0 THEN DO
	mode = cfg.cyc.3 + 1; cfg.swt.3 = 0; cfg.swt.4 = 0; cfg.swt.5 = 0
	type.1 = "TD"; type.2 = "GMS"; mode.1 = "CALL"; mode.2 = "POLL"
	cfg.pop.3 = "CALL 'mail/Poll_" || type.type || "'('OPEN')"
	cfg.pop.4 = "CALL 'mail/Poll_" || type.type || "'('" || mode.mode || "',%S,cfg.sld.2 cfg.sld.3 cfg.sld.1,cfg.pop.6,cfg.pop.7)"
	cfg.pop.5 = "CALL 'mail/Poll_" || type.type || "'('QUIT')"
END


PARSE VAR cfg.pop.4 sx"%S"dx
IF mode < 2 THEN CALL run_cmd(cfg.pop.3,cfg.swt.3)
nodes = ""
IF mode = 3 THEN DO			/* Scheduling */
	DO n = 0 FOR node.count
		node.n = chk_dupes(node.n,nodes); IF node.n ~= "" THEN nodes = nodes || node.n || '0a'x
	END
	IF 'dos/WriteBlock'(cfg.pop.2,nodes) THEN CALL run_cmd(sx'"'cfg.pop.2'"'dx,cfg.swt.4)
END
ELSE IF mode = 2 THEN DO	/* Do all nodes */
	nodes = node.0
	DO n = 1 FOR node.count - 1
		node.n = chk_dupes(node.n,nodes); IF node.n ~= "" THEN nodes = nodes"|"node.n
	END
	CALL run_cmd(sx'"'nodes'"'dx,cfg.swt.4)
END
ELSE IF mode = 1 THEN		/* Node with aka */
	DO n = 0 FOR node.count
		node.n = chk_dupes(node.n,nodes)
		IF node.n = "" | ~EXISTS(file.n) THEN ITERATE
		CALL run_cmd(sx'"'node.n'"'dx,cfg.swt.4); nodes = nodes node.n
	END
ELSE IF mode = 0 THEN		/* Node by node */
	DO n = 0 FOR node.count
		node.n = chk_dupes(node.n,nodes); nodes = nodes node.n
		DO m = 1 TO WORDS(node.n)
			IF EXISTS(file.n) THEN CALL run_cmd(sx'"'WORD(node.n,m)'"'dx,cfg.swt.4)
		END
	END
IF mode < 2 THEN CALL run_cmd(cfg.pop.5,cfg.swt.5)

RETURN


/*
 *	run_cmd(cmd,type)
 *
 *	type = 1	executable command line (AmigaDOS/batch)
 *	type = 0	ARexx command line
 */
run_cmd: PROCEDURE EXPOSE cfg.
PARSE ARG cmd,ctp
	IF cmd = "" THEN RETURN 0
	IF ctp = 0 THEN
		INTERPRET cmd
	ELSE ADDRESS COMMAND cmd
	RETURN 1

/*
 *	chk_dupes(src_string,dst_string)
 */
chk_dupes: PROCEDURE
PARSE ARG src,dst
	DO m = 1 FOR WORDS(src)
		IF POS(WORD(src,m),dst) = 0 THEN ITERATE
		src = DELWORD(src,m); m = m - 1
	END
	RETURN src
