1 | XML ;(WASH ISC)/THM/GJL-MailMan Physical link ;06/04/2002 08:26
|
---|
2 | ;;8.0;MailMan;;Jun 28, 2002
|
---|
3 | ; Entry points (DBIA 1283):
|
---|
4 | ; GET - Set up variables for communications protocol in file 3.4
|
---|
5 | ;
|
---|
6 | ; Entry points used by MailMan options (not covered by DBIA):
|
---|
7 | ; C XMDXPROT
|
---|
8 | OPEN ;
|
---|
9 | N Y
|
---|
10 | I $G(XMCHAN)="" S XMCHAN="SCP"
|
---|
11 | D GET Q:ER
|
---|
12 | D OP Q:ER
|
---|
13 | S:'$D(XMESC) XMESC="~"
|
---|
14 | S:'$D(XMFS) XMFS=255
|
---|
15 | S:'$D(XM) XM=""
|
---|
16 | Q
|
---|
17 | GET ; Set up variables for communications protocol in file 3.4
|
---|
18 | ; In:
|
---|
19 | ; XMCHAN - Name of the communications protocol
|
---|
20 | ; Out:
|
---|
21 | ; XMCHAN - IEN of the communications protocol
|
---|
22 | ; XMPROT - Name of the communications protocol
|
---|
23 | ; XMSEN - Xecute this variable to send a line
|
---|
24 | ; XMREC - Xecute this variable to receive a line
|
---|
25 | ; XMOPEN - Xecute this variable to open the channel
|
---|
26 | ; XMCLOSE - Xecute this variable to close the channel
|
---|
27 | ; XMOS - Operating System, used in ^XMLTCP
|
---|
28 | N DIC,X
|
---|
29 | S X=XMCHAN,DIC="^DIC(3.4,",DIC(0)="FO"
|
---|
30 | D ^DIC I Y<0 D Q
|
---|
31 | . D ERTRAN^XMC1(42244,XMCHAN) ;Invalid Communications Protocol: '|1|'
|
---|
32 | . S Y=XMTRAN
|
---|
33 | S XMCHAN=+Y,XMPROT=$P(Y,U,2)
|
---|
34 | S XMSEN=$G(^DIC(3.4,XMCHAN,1),"Q"),XMREC=$G(^(2),"Q"),XMOPEN=$G(^(3),"Q"),XMCLOSE=$G(^(4),"Q")
|
---|
35 | S XMOS=^%ZOSF("OS")
|
---|
36 | I XMOS["MSM" D
|
---|
37 | . S XMOS("MSMVER")=$P($ZV," 4.0.",2)
|
---|
38 | . S:+XMOS("MSMVER")=0 XMOS("MSMVER")=8
|
---|
39 | Q
|
---|
40 | OP ;
|
---|
41 | I "Q"'[$G(XMOPEN) X XMOPEN
|
---|
42 | I 'XMC("BATCH"),'$D(XMQUIET) S X=255 X ^%ZOSF("RM")
|
---|
43 | Q
|
---|
44 | C X ^%ZOSF("EON")
|
---|
45 | I $D(XMCLOSE) X:$L(XMCLOSE) XMCLOSE
|
---|
46 | Q
|
---|
47 | ; The following has nothing to do with the above.
|
---|
48 | ; These are used by the SCP Communications Protocol in file 3.4.
|
---|
49 | SEND ; Sends XMSG, returns ER=0 or 1, and XMLER=number of "soft" errors
|
---|
50 | I $L(XMSG)>255 S XMLER=0,ER=1 G SRQ
|
---|
51 | I XMSG'?.ANP F %=1:1:$L(XMSG) I $E(XMSG,%)?1C,$A(XMSG,%)'=9 S XMSG=$E(XMSG,1,%-1)_$E(XMSG,%+1,999) Q:XMSG?.ANP S %=%-1
|
---|
52 | D SRINIT S X=XMSG D SUM
|
---|
53 | I $G(XMINST) D XMTSTAT^XMTDR(XMINST,"S",XMSG,0)
|
---|
54 | SL S XMLER=XMLER+1 I (XMLER+1)>XMLMAXER D NEWSTRAT
|
---|
55 | I ER W XMLERR,$C(13) G SRQ
|
---|
56 | D BUFLUSH W XMSG,$C(13) W XMLINE,U,XMSUM,$C(13) R XMLX:XMLTIME G:XMLX=(XMLINE_U_XMLACK) SRQ
|
---|
57 | S XMLY=XMLX=(XMLINE_U_XMLNAK),XMLZ=0 D:'XMLY ENQ G SL:XMLY,SRQ
|
---|
58 | ENQ ; ACK/NAK garbled - try to re-establish contact
|
---|
59 | S XMLZ=XMLZ+1 I XMLZ>XMLMAXER S (ER,XMLY)=1 Q
|
---|
60 | D BUFLUSH W XMLENQ,$C(13) R XMLX:XMLTIME Q:XMLX=(XMLINE_U_XMLACK)
|
---|
61 | I XMLX[XMLACK!(XMLX[XMLNAK),+XMLX=XMLINE!(+XMLX=XMLINE-1) S XMLY=1 Q
|
---|
62 | H 1 G ENQ
|
---|
63 | REC ; Receives XMRG, returns ER=0 or 1, and XMLER=number of "soft" errors
|
---|
64 | D SRINIT S:'$D(XMLAN) XMLAN=XMLINE_U_XMLNAK
|
---|
65 | I $D(XMRG),$G(XMINST) D XMTSTAT^XMTDR(XMINST,"R",XMRG,0)
|
---|
66 | RL S XMLER=XMLER+1 I (XMLER+1)>XMLMAXER D NEWSTRAT I ER=1 G SRQ
|
---|
67 | R XMRG#255:$S($D(XMSTIME):XMSTIME,1:XMLTIME)
|
---|
68 | S XMLZ=$S('$T:-1,XMRG=XMLENQ:0,XMRG=XMLERR:2,1:1)
|
---|
69 | S ER=XMLZ=2 G:XMLZ>1 SRQ I 'XMLZ D BUFLUSH W XMLAN,$C(13) G RL
|
---|
70 | R XMLY:XMLTIME
|
---|
71 | I +XMLY=XMLINE S X=XMRG D SUM S XMLZ=XMSUM=$P(XMLY,U,2) G RL2
|
---|
72 | S XMLZ=0 I +XMLY=(XMLINE-1),XMLINE'=1 D BUFLUSH W +XMLY,U,XMLACK,$C(13) G RL
|
---|
73 | RL2 S XMLAN=XMLINE_U_$S(XMLZ:XMLACK,1:XMLNAK) D BUFLUSH W XMLAN,$C(13)
|
---|
74 | G SRQ:XMLZ,RL
|
---|
75 | SRINIT ; Initialize variables for Send/Receive
|
---|
76 | S XMLINE=$S('$D(XMLINE):1,1:XMLINE+1),XMLACK="ACK",XMLNAK="NAK"
|
---|
77 | S XMLENQ=$C(9)_"ENQ"_$C(9),XMLERR=$C(9)_"ERROR"_$C(9)
|
---|
78 | S XMLER=-1 ;soft error count
|
---|
79 | S XMLMAXER=5 ;maximum allowable soft errors
|
---|
80 | S XMLTIME=30 ;length of READ time
|
---|
81 | S ER=0 ;non-recoverable error flag
|
---|
82 | Q
|
---|
83 | NEWSTRAT ; Select new strategy, one or both machines may be slow
|
---|
84 | I XMLMAXER=5 S ER=1 Q ;already tried new strategy, give up.
|
---|
85 | S XMTLER=$S('$D(XMTLER):XMLER,1:XMTLER+XMLER),XMLER=0 ;add to total
|
---|
86 | S XMLMAXER=5 ;reduce allowable soft errors
|
---|
87 | S XMLTIME=30 ;increase the READ time
|
---|
88 | Q
|
---|
89 | SRQ ; Exit from Send/Receive
|
---|
90 | S XMTLER=$S('$D(XMTLER):XMLER,1:XMTLER+XMLER) ;Total errors
|
---|
91 | K XMLACK,XMLNAK,XMLENQ,XMLERR,XMLMAXER,XMLTIME,XMLX,XMLY,XMLZ
|
---|
92 | Q
|
---|
93 | BUFLUSH ; Flush buffer
|
---|
94 | Q:'$D(XMBFLUSH)
|
---|
95 | X ^%ZOSF("TRMON") S X=$P($H,",",2) F %=1:1 R %:0 Q:'$T S %=$P($H,",",2) S:%<X %=%+86400 Q:%-X>15
|
---|
96 | X ^%ZOSF("TRMOFF")
|
---|
97 | Q
|
---|
98 | SUM ; Calculate checksum, accounting also for the character's position
|
---|
99 | S XMSUM=0 F %=1:1:$L(X) S XMSUM=XMSUM+($A(X,%)*%)
|
---|
100 | Q
|
---|