1 | XMC1 ;ISC-SF/GMB-Script Interpreter ;07/23/2002 10:15
|
---|
2 | ;;8.0;MailMan;;Jun 28, 2002
|
---|
3 | ; Was (WASH ISC)/THM
|
---|
4 | ;
|
---|
5 | ; Entry points used by MailMan options (not covered by DBIA):
|
---|
6 | ; RESUME XMSCRIPTRES (was RES^XMC11)
|
---|
7 | ENT ;
|
---|
8 | ; Expects as input:
|
---|
9 | ; XMINST Domain IEN
|
---|
10 | ; XMSITE Domain name
|
---|
11 | ; XMB("SCR IEN") Script IEN
|
---|
12 | I $$NEWERR^%ZTER N $ETRAP,$ESTACK S $ETRAP="D C^XMCTRAP"
|
---|
13 | E S X="C^XMCTRAP",@^%ZOSF("TRAP")
|
---|
14 | K ^TMP("XMY",$J),^TMP("XMY0",$J)
|
---|
15 | N XMLER,XMLIN
|
---|
16 | S ER=0,XMC("SHOW TRAN")="RS"
|
---|
17 | D GET^XMCXT(0)
|
---|
18 | I '$D(^XMBS(4.2999,XMINST,0)) D STAT^XMTDR(XMINST)
|
---|
19 | ; *** how about L +^XMBS(4.2999,XMINST,3) ?
|
---|
20 | I '$D(XMC("TALKMODE")) L +^DIC(4.2,XMINST,"XMNETSEND"):0 E D Q
|
---|
21 | . D ERTRAN(42210) ;Netmail transmission in progress on another channel
|
---|
22 | D IN
|
---|
23 | L -^DIC(4.2,XMINST,"XMNETSEND")
|
---|
24 | Q
|
---|
25 | IN ;To |1| from |2| beginning |3|
|
---|
26 | D DOTRAN(42211,XMSITE,^XMB("NETNAME"),$$FMTE^XLFDT(DT,5))
|
---|
27 | D DOTRAN(42212,$P(XMB("SCR REC"),U)) ;Script: |1|
|
---|
28 | I $$USESCR(XMINST,.XMB) D
|
---|
29 | . D EN(XMINST,XMSITE,$P(XMB("SCR REC"),U),"^DIC(4.2,"_XMINST_",1,"_XMB("SCR IEN")_",1,")
|
---|
30 | E D
|
---|
31 | . N XMNETREC,X,XMC1,XMSCRN
|
---|
32 | . S XMNETREC=$G(^XMB(1,1,"NETWORK"))
|
---|
33 | . S XMSCRN=$P(XMB("SCR REC"),U)
|
---|
34 | . D DOTRAN(42213) ;Creating transmission script 'on the fly' ...
|
---|
35 | . S X="O H="_XMSITE_",P="_$P(^DIC(3.4,$P(XMNETREC,U,3),0),U)
|
---|
36 | . S XMC1=$P(X," ",2,999)
|
---|
37 | . D O Q:ER
|
---|
38 | . S X="C "_$P(^XMB(4.6,$P(XMNETREC,U,4),0),U)
|
---|
39 | . S XMC1=$P(X," ",2,999)
|
---|
40 | . D C
|
---|
41 | Q:$D(XMC("TALKMODE"))
|
---|
42 | I ER,'$D(ER("MSG")),XMTRAN'="" D TRAN
|
---|
43 | D DOTRAN(42214) ; Script Complete.
|
---|
44 | I ER D DOTRAN(42215) ; Stopped because of error.
|
---|
45 | D CLOSE^XMC1B
|
---|
46 | Q
|
---|
47 | USESCR(XMINST,XMB) ; Function returns 1 if we should use the existing
|
---|
48 | ; script, or 0 if we should build a TCP/IP script.
|
---|
49 | Q:"^^SMTP^TCPCHAN^"'[(U_$P(XMB("SCR REC"),U,4)) 1 ; Use it
|
---|
50 | N XMNETREC
|
---|
51 | S XMNETREC=$G(^XMB(1,1,"NETWORK"))
|
---|
52 | Q:'$P(XMNETREC,U,3)!'$P(XMNETREC,U,4) 1 ; Use it
|
---|
53 | Q $O(^DIC(4.2,XMINST,1,XMB("SCR IEN"),1,0))>0 ;1=Use it; 0=Build it
|
---|
54 | EN(XMINST,XMSITE,XMSCRN,XMROOT) ;
|
---|
55 | I $$NEWERR^%ZTER N $ETRAP,$ESTACK S $ETRAP="D C^XMCTRAP"
|
---|
56 | E S X="C^XMCTRAP",@^%ZOSF("TRAP")
|
---|
57 | N XMCI
|
---|
58 | S XMCI=0
|
---|
59 | F S XMCI=$O(@(XMROOT_XMCI_")")) Q:'XMCI D INT(@(XMROOT_XMCI_",0)"),XMCI) Q:ER
|
---|
60 | Q
|
---|
61 | INT(X,XMCI) ; Interpret the script line
|
---|
62 | ; X script line
|
---|
63 | N XMC1
|
---|
64 | S ER=0
|
---|
65 | S:$E(X)?1L X=$$UP^XLFSTR(X)_$E(X,2,999)
|
---|
66 | I "EFCXOHMDLTSW"'[$E(X)!(X="") D Q
|
---|
67 | . D ERTRAN(42216,X,XMCI) ;Invalid script command '|1|' at line |2|
|
---|
68 | S XMC1=$P(X," ",2,999)
|
---|
69 | D @$E(X)
|
---|
70 | S:'$D(ER) ER=0
|
---|
71 | Q
|
---|
72 | C ; Call a subroutine
|
---|
73 | D DOTRAN(X)
|
---|
74 | N X,Y,DIC,XMNSCR,XMNSCRN,XMER
|
---|
75 | S X=$P(XMC1,"("),DIC="^XMB(4.6,",DIC(0)="O" D ^DIC
|
---|
76 | I Y<0 D Q
|
---|
77 | . D ERTRAN(42217,X) ;Script '|1|' cannot be found in file 4.6
|
---|
78 | S XMNSCR=+Y,XMNSCRN=$P(Y,U,2)
|
---|
79 | D DOTRAN(42218,XMNSCRN) ;Calling script '|1|' (file 4.6)
|
---|
80 | D EN(XMINST,XMSITE,XMNSCRN,"^XMB(4.6,XMNSCR,1,")
|
---|
81 | I ER D Q ; XMER may be set by the transmission script in file 4.6
|
---|
82 | . I $D(XMER),'$D(ER("MSG")) D ERTRAN(XMER)
|
---|
83 | D DOTRAN(42219,XMSCRN) ;Returning to script '|1|'.
|
---|
84 | Q
|
---|
85 | DI ; Dial phone
|
---|
86 | N XMC1,DIR,X,Y
|
---|
87 | S DIR(0)="F^3:50"
|
---|
88 | S DIR("A")=$$EZBLD^DIALOG(42220) ;Enter number(s) to dial
|
---|
89 | D ^DIR Q:$D(DIRUT)
|
---|
90 | S XMC1=Y
|
---|
91 | D ; Dial numbers sucessively (Strip all punctuation not in XMSTRIP string)
|
---|
92 | D DIAL(XMC1)
|
---|
93 | Q
|
---|
94 | DIAL(XMNUMS) ;
|
---|
95 | N XMSEP,XMI,XMNUM
|
---|
96 | S XMSEP=$S($L($G(XMFIELD)):XMFIELD,1:$S($G(XMSTRIP)[",":";",1:","))
|
---|
97 | F XMI=1:1 S XMNUM=$P(XMNUMS,XMSEP,XMI) Q:XMNUM="" D DIALTRY(XMNUM) Q:'ER
|
---|
98 | K XMSTRIP,XMFIELD
|
---|
99 | Q
|
---|
100 | DIALTRY(XMNUM) ;
|
---|
101 | N XMPHONE,XMI,XMDIGIT,Y
|
---|
102 | S XMPHONE=""
|
---|
103 | F XMI=1:1:$L(XMNUM) S XMDIGIT=$E(XMNUM,XMI) I $S(XMDIGIT'?1P:1,$G(XMSTRIP)[XMDIGIT:1,1:0) S XMPHONE=XMPHONE_XMDIGIT
|
---|
104 | S ER=0
|
---|
105 | D DOTRAN(42221,XMPHONE) ;Dialing |1|
|
---|
106 | I '$D(XMDIAL) D ERTRAN(42222) Q ;Call failed: no XMDIAL
|
---|
107 | X XMDIAL
|
---|
108 | I ER D ERTRAN($S($D(Y):42222.1,1:42222.2),$G(Y)) ;Call failed: |1| or unknown reason
|
---|
109 | Q
|
---|
110 | E ; Set error message to be displayed.
|
---|
111 | S ER("MSG")=XMC1
|
---|
112 | D DOTRAN(42223,ER("MSG")) ;Error message set to '|1|'
|
---|
113 | Q
|
---|
114 | F ; Flush buffer
|
---|
115 | D DOTRAN(42224) ;Flushing buffer
|
---|
116 | G BUFLUSH^XML
|
---|
117 | Q
|
---|
118 | H ; Hang up phone
|
---|
119 | D DOTRAN(42225) ;Hanging up phone
|
---|
120 | Q:'$D(XMHANG)
|
---|
121 | X XMHANG
|
---|
122 | Q
|
---|
123 | L ; Look for string
|
---|
124 | D LOOK^XMC1A
|
---|
125 | Q
|
---|
126 | M ; Send mail
|
---|
127 | D DOTRAN(42226) ;Beginning sender-SMTP service
|
---|
128 | D ENTER^XMS
|
---|
129 | I ER D DOTRAN("ER="_ER_" - ER(""MSG"")="_$G(ER("MSG")))
|
---|
130 | Q
|
---|
131 | O ; Open device, protocol, and host
|
---|
132 | D DOTRAN(X)
|
---|
133 | D OPEN^XMC1B X:'ER XMOPEN
|
---|
134 | I ER D DOTRAN(42227) Q ;Open failed
|
---|
135 | D DOTRAN(42228,XMSITE) ;Channel opened to |1|
|
---|
136 | D FLUSH
|
---|
137 | D DOTRAN(42229,XMC("DEVICE"),XMPROT) ;Device '|1|', Protocol '|2|' (file 3.4)
|
---|
138 | N XMFDA,XMIENS
|
---|
139 | S XMIENS=XMINST_","
|
---|
140 | S XMFDA(4.2999,XMIENS,1)=$H
|
---|
141 | S XMFDA(4.2999,XMIENS,6)=IO ; Device
|
---|
142 | D FILE^DIE("","XMFDA")
|
---|
143 | Q
|
---|
144 | FLUSH ; Flush buffer
|
---|
145 | Q:'$D(XMBFLUSH)
|
---|
146 | N XMLX
|
---|
147 | F R XMLX:0 Q:'$T
|
---|
148 | Q
|
---|
149 | S ; Send line
|
---|
150 | I XMC1?1"@".E D Q:ER
|
---|
151 | . N XMSAVE
|
---|
152 | . S XMSAVE=XMC1
|
---|
153 | . D INDIR(.XMC1) Q:ER
|
---|
154 | . D DOTRAN(42230,XMSAVE,XMC1) ;Transforming '|1|' to '|2|'
|
---|
155 | I XMC("SHOW TRAN")["S" D DOTRAN("S: "_XMC1)
|
---|
156 | I XMC1["~" S XMC1=$$RTRAN^XMCU1(XMC1)
|
---|
157 | W XMC1,$C(13)
|
---|
158 | Q
|
---|
159 | INDIR(XMC1) ; GET INDIRECT REFERENCE
|
---|
160 | N XMREF
|
---|
161 | S XMREF=$P(XMC1,"@",2,99)
|
---|
162 | I '$D(@XMREF) D ERTRAN(42231,XMREF) Q ;Undefined reference to |1|
|
---|
163 | S XMC1=@XMREF
|
---|
164 | Q
|
---|
165 | T ;
|
---|
166 | Q:'$D(XMC("TALKMODE"))
|
---|
167 | S XMCI=999999
|
---|
168 | D DOTRAN(42232) ;Entering Talk mode
|
---|
169 | Q
|
---|
170 | W ; Wait a number of seconds
|
---|
171 | D DOTRAN(42233,XMC1) ;Waiting |1| seconds
|
---|
172 | H +XMC1
|
---|
173 | Q
|
---|
174 | X ; Execute a line of code
|
---|
175 | D DOTRAN(42234,XMC1) ;Xecuting |1|
|
---|
176 | X XMC1
|
---|
177 | Q:'ER
|
---|
178 | I $E(XMC1,1,2)'="O ",$E(XMC1,1,14)'="D CALL^%ZISTCP" Q
|
---|
179 | D ERTRAN(42235,XMHOST) S ER=25 ;Can't connect using IP address |1|
|
---|
180 | Q
|
---|
181 | ERTRAN(XMDIALOG,XM1,XM2,XM3) ;
|
---|
182 | D DOTRAN(XMDIALOG,.XM1,.XM2,.XM3)
|
---|
183 | S ER=1
|
---|
184 | I '$D(ER("MSG")) S ER("MSG")=XMTRAN
|
---|
185 | Q
|
---|
186 | DOTRAN(XMDIALOG,XM1,XM2,XM3) ;
|
---|
187 | N XMPARM
|
---|
188 | S:$D(XM1) XMPARM(1)=XM1 S:$D(XM2) XMPARM(2)=XM2 S:$D(XM3) XMPARM(3)=XM3
|
---|
189 | S XMTRAN=$S(+XMDIALOG=XMDIALOG:$$EZBLD^DIALOG(XMDIALOG,.XMPARM),1:XMDIALOG)
|
---|
190 | ; fall through...
|
---|
191 | TRAN ;
|
---|
192 | N XMTIME,XMAUDIT
|
---|
193 | S XMTIME=$P($H,",",2)
|
---|
194 | S XMAUDIT=$E($TR($J(XMTIME\3600,2)_":"_$J(XMTIME#3600\60,2)_":"_$J(XMTIME#60,2)," ","0")_" "_XMTRAN,1,245)
|
---|
195 | ; Trace / Debug transmission problems
|
---|
196 | ; Field 8.2 in file 4.3 says whether to audit.
|
---|
197 | I $G(XMC("AUDIT")) S XMC("AUDIT","I")=$G(XMC("AUDIT","I"))+1,^TMP("XMC",XMC("AUDIT"),XMC("AUDIT","I"),0)=XMAUDIT
|
---|
198 | Q:$G(XM)'["D"
|
---|
199 | U IO(0)
|
---|
200 | W !,XMAUDIT
|
---|
201 | W:$G(XMLER) "("_XMLER_")"
|
---|
202 | I IO'="",IOT'="RES" U IO
|
---|
203 | Q
|
---|
204 | RESUME ; Resume script processing
|
---|
205 | N I,DIR,X,Y
|
---|
206 | S:'$D(XMCI) XMCI=0
|
---|
207 | D ^%ZIS Q:POP
|
---|
208 | S I=0
|
---|
209 | F S I=$O(^DIC(4.2,XMINST,1,XMB("SCR IEN"),1,I)) Q:I="" W !,$J(I,2),$S(I=XMCI:"->",1:" "),^(I,0)
|
---|
210 | S DIR(0)="N^1:"_$O(^DIC(4.2,XMINST,1,XMB("SCR IEN"),1,""),-1)
|
---|
211 | S DIR("A")=$$EZBLD^DIALOG(42236) ;Resume script processing from line
|
---|
212 | S DIR("B")=XMCI
|
---|
213 | D ^DIR Q:$D(DIRUT)
|
---|
214 | S XMCI=Y
|
---|
215 | D DOTRAN(42237,XMCI) ;Resuming script from line |1|
|
---|
216 | S XMCI=XMCI-.1
|
---|
217 | U IO
|
---|
218 | G IN
|
---|
219 | Q
|
---|