| 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
 | 
|---|