| 1 | XMAPHOST ;ISC-SF/GMB-Print to Message (P-MESSAGE) ;07/29/2003  14:36 | 
|---|
| 2 | ;;8.0;MailMan;**2,17,21,28,33**;Jun 28, 2002 | 
|---|
| 3 | ;Was (WASH ISC)/KMB/CAP before extensive rework. | 
|---|
| 4 | ; | 
|---|
| 5 | ;This routine handles printing to P-MESSAGE. | 
|---|
| 6 | ; | 
|---|
| 7 | ;To print reports to mail messages, we actually write to host files | 
|---|
| 8 | ;(DOS,VMS...) and then suck them into mail messages.  MailMan works | 
|---|
| 9 | ;closely with TaskMan and the device handler to make it happen. | 
|---|
| 10 | ; | 
|---|
| 11 | ;If a user or application wants to write something to a mail message, | 
|---|
| 12 | ;the user should choose (or the application should set ZTIO=) a device | 
|---|
| 13 | ;whose name starts with "P-MESSAGE".  The user or application can | 
|---|
| 14 | ;set the subject of the message, as well as the recipients.  The user | 
|---|
| 15 | ;does this by responding to MailMan queries, and the application does | 
|---|
| 16 | ;this by setting input variables (see below). | 
|---|
| 17 | ; | 
|---|
| 18 | ;EN^XMAPHOST is called as a pre-open execute for the P-MESSAGE device, | 
|---|
| 19 | ;and READ^XMAPHOST is called as a close execute for the P-MESSAGE | 
|---|
| 20 | ;terminal type. | 
|---|
| 21 | ; | 
|---|
| 22 | ;The pre-open execute is there to capture the wishes (message subject, | 
|---|
| 23 | ;recipients, and whether to queue or not) of the user working in the | 
|---|
| 24 | ;foreground.  The global ^TMP("XM-MESS",$J) is created, as a result. | 
|---|
| 25 | ;TaskMan looks for this global whenever $E(ZTIO,1,9)="P-MESSAGE", and | 
|---|
| 26 | ;includes it in the task, if the user chooses to task the print.  This | 
|---|
| 27 | ;is a special arrangement that MailMan has with TaskMan. | 
|---|
| 28 | ; | 
|---|
| 29 | ;If the job printing to P-MESSAGE is running in the background, then | 
|---|
| 30 | ;the pre-open execute code does not get executed during the pre-open | 
|---|
| 31 | ;execute; instead, it is run as part of the close execute. | 
|---|
| 32 | ; | 
|---|
| 33 | ;If more than 250 consecutive null lines are encountered, MailMan | 
|---|
| 34 | ;assumes EOF has somehow been missed, and stops transferring lines from | 
|---|
| 35 | ;the host file to the message. | 
|---|
| 36 | ; | 
|---|
| 37 | ;This routine has one idiosyncracy.  If the report contains one single | 
|---|
| 38 | ;line or two lines separated with only a $C(13) instead of a CR/LF that | 
|---|
| 39 | ;is more than 254 characters long, there will be unexpected results. | 
|---|
| 40 | ; | 
|---|
| 41 | ;Variables: | 
|---|
| 42 | ;input: | 
|---|
| 43 | ;  XMDUZ   (optional) Sender DUZ or string (default=DUZ) | 
|---|
| 44 | ;          If XMDUZ is a string, then user will not be asked who the | 
|---|
| 45 | ;          message should be from. | 
|---|
| 46 | ;  XMSUB   (optional) message subject.  If not supplied, then default | 
|---|
| 47 | ;          subject is "Queued mail report from "<user name> | 
|---|
| 48 | ;  XMY(x)="" (optional) array of additional addressees to whom the | 
|---|
| 49 | ;          message should be sent.  See documentation for ^XMD for more | 
|---|
| 50 | ;          info on XMY. | 
|---|
| 51 | ;          The message will always be sent to XMDUZ (unless XMDUZ is a | 
|---|
| 52 | ;          string), so it is not necessary to set XMY(XMDUZ)="". | 
|---|
| 53 | ;  XMQUIET (optional) if $G(XMQUIET), then there is no user interaction | 
|---|
| 54 | ;          and no information written to the screen. | 
|---|
| 55 | ;  XMZBACK (optional) if $D(XMZBACK), then XMZ is set upon exit, | 
|---|
| 56 | ;          and XMZBACK is killed. | 
|---|
| 57 | ;output: | 
|---|
| 58 | ;  XMZ     If $D(XMZBACK), then XMZ is set with the IEN of the message, | 
|---|
| 59 | ;          and XMZBACK is killed; otherwise, XMZ is not set, and | 
|---|
| 60 | ;          remains whatever it was (or wasn't) before the call. | 
|---|
| 61 | ;  XMMG    If error, may contain error message. | 
|---|
| 62 | ;  XMV("ERROR") If error, may contain error message. | 
|---|
| 63 | ; | 
|---|
| 64 | EN ; Entry from pre-open execute of P-MESSAGE entry in DEVICE file. | 
|---|
| 65 | ; If the user chooses to queue the print, we don't want this code | 
|---|
| 66 | ; (the pre-open execute of the DEVICE file entry) to execute when | 
|---|
| 67 | ; the task starts up. | 
|---|
| 68 | K ^TMP("XM-MESS",$J) | 
|---|
| 69 | N %H | 
|---|
| 70 | Q:$D(ZTQUEUED)!$G(XMQUIET)!$D(DDS) | 
|---|
| 71 | N XMAPHOST,XMABORT | 
|---|
| 72 | D SETUP(.XMAPHOST,.XMABORT) I XMABORT S (POP,DUOUT,%ZISQUIT)=1 K IO("Q") Q | 
|---|
| 73 | M ^TMP("XM-MESS",$J,"XMY")=^TMP("XMY",$J) | 
|---|
| 74 | M ^TMP("XM-MESS",$J,"XMY0")=^TMP("XMY0",$J) | 
|---|
| 75 | M ^TMP("XM-MESS",$J,"XMAPHOST")=XMAPHOST | 
|---|
| 76 | D CLEANUP^XMXADDR | 
|---|
| 77 | D KSETS | 
|---|
| 78 | Q | 
|---|
| 79 | SETUP(XMAPHOST,XMABORT) ; Entry during close-execute (called from READ^XMAPHOST) | 
|---|
| 80 | N XMINSTR | 
|---|
| 81 | S XMABORT=0 | 
|---|
| 82 | D INIT(.XMDUZ,.XMAPHOST,.XMINSTR,.XMABORT) | 
|---|
| 83 | I 'XMABORT D GETSUBJ($S($D(XMAPSUBJ):XMAPSUBJ,$D(XMSUB):XMSUB,1:""),.XMAPHOST,.XMABORT) | 
|---|
| 84 | I 'XMABORT D FROMWHOM(XMDUZ,.XMINSTR,.XMABORT) | 
|---|
| 85 | I 'XMABORT D ADDRMSG(XMDUZ,.XMINSTR,.XMABORT) | 
|---|
| 86 | I 'XMABORT M XMAPHOST("XMINSTR")=XMINSTR Q | 
|---|
| 87 | D CLEANUP^XMXADDR | 
|---|
| 88 | D KSETS | 
|---|
| 89 | Q | 
|---|
| 90 | INIT(XMDUZ,XMAPHOST,XMINSTR,XMABORT) ; | 
|---|
| 91 | I '$D(XMDUZ) S XMDUZ=DUZ,XMAPHOST("SET XMDUZ")=1 K XMV | 
|---|
| 92 | S XMAPHOST("CHG XMDUZ")=XMDUZ | 
|---|
| 93 | D SETFROM^XMD(.XMDUZ,.XMINSTR) I $D(XMMG) S XMABORT=1 Q | 
|---|
| 94 | I '$D(XMINSTR("FROM")) K XMAPHOST("CHG XMDUZ") | 
|---|
| 95 | I '$D(XMV("NAME")) D  Q:XMABORT | 
|---|
| 96 | . S XMAPHOST("SET XMV")=1 | 
|---|
| 97 | . D INITAPI^XMVVITAE | 
|---|
| 98 | . I $D(XMV("ERROR")) S XMABORT=1 D:'$D(ZTQUEUED) ERROR^XM(.XMV,"ERROR") | 
|---|
| 99 | I $D(XMZBACK) S XMAPHOST("XMZBACK")="" K XMZBACK | 
|---|
| 100 | S XMAPHOST("XMDUZ")=XMDUZ | 
|---|
| 101 | M XMAPHOST("XMV")=XMV | 
|---|
| 102 | Q | 
|---|
| 103 | GETSUBJ(XMSUBJ,XMAPHOST,XMABORT) ; | 
|---|
| 104 | D CHKSUBJ(.XMSUBJ) | 
|---|
| 105 | I $D(ZTQUEUED)!$G(XMQUIET) D | 
|---|
| 106 | . S XMSUBJ=$G(XMSUBJ,$E($$EZBLD^DIALOG(34233,XMV("NAME")),1,65)) ; queued mail report from |1| | 
|---|
| 107 | E  D SUBJ^XMJMS(.XMSUBJ,.XMABORT) Q:XMABORT | 
|---|
| 108 | S XMAPHOST("XMSUB")=XMSUBJ | 
|---|
| 109 | Q | 
|---|
| 110 | CHKSUBJ(XMSUBJ) ; | 
|---|
| 111 | I XMSUBJ="" K XMSUBJ Q | 
|---|
| 112 | K XMERR,^TMP("XMERR",$J) | 
|---|
| 113 | I $L(XMSUBJ)<3 S XMSUBJ=XMSUBJ_"..." | 
|---|
| 114 | I $L(XMSUBJ)>65 S XMSUBJ=$E(XMSUBJ,1,65) | 
|---|
| 115 | S XMSUBJ=$$XMSUBJ^XMXPARM("",XMSUBJ) | 
|---|
| 116 | I $D(XMERR) K XMSUBJ,XMERR,^TMP("XMERR",$J) | 
|---|
| 117 | Q | 
|---|
| 118 | FROMWHOM(XMDUZ,XMINSTR,XMABORT) ; | 
|---|
| 119 | I XMDUZ=.5!$D(XMINSTR("FROM")) Q | 
|---|
| 120 | N XMFROM | 
|---|
| 121 | S XMFROM=$P($G(^XMB(3.7,XMDUZ,16)),U,3) | 
|---|
| 122 | I $D(ZTQUEUED)!$G(XMQUIET) D  Q | 
|---|
| 123 | . I XMFROM="P" S XMINSTR("FROM")="POSTMASTER" | 
|---|
| 124 | N DIR,X,Y,XMME,XMPOST | 
|---|
| 125 | S DIR("A")=$$EZBLD^DIALOG(34239) ; From whom | 
|---|
| 126 | S XMME=$$EZBLD^DIALOG(34240)   ; M:Me | 
|---|
| 127 | S XMPOST=$$EZBLD^DIALOG(34241) ; P:Postmaster | 
|---|
| 128 | S DIR(0)="S^"_XMME_";"_XMPOST | 
|---|
| 129 | S DIR("B")=$S(XMFROM="P":$P(XMPOST,":",2,9),1:$P(XMME,":",2,9)) | 
|---|
| 130 | D BLD^DIALOG(34242,"","","DIR(""?"")") ; Answer 'Me' if the message should be from... | 
|---|
| 131 | D ^DIR I $D(DIRUT) S XMABORT=1 Q | 
|---|
| 132 | I Y=$P(XMPOST,":",1) S XMINSTR("FROM")="POSTMASTER" | 
|---|
| 133 | Q | 
|---|
| 134 | ADDRMSG(XMDUZ,XMINSTR,XMABORT) ; | 
|---|
| 135 | ;I '$D(ZTQUEUED),'$G(XMQUIET) K XMY,XMY0 | 
|---|
| 136 | D INIT^XMXADDR | 
|---|
| 137 | K XMERR,^TMP("XMERR",$J) | 
|---|
| 138 | I $D(ZTQUEUED)!$G(XMQUIET) D | 
|---|
| 139 | . I '$D(XMAPHOST("CHG XMDUZ")) S XMY(XMDUZ)="" | 
|---|
| 140 | . D CHKBSKT^XMD(.XMY,.XMINSTR) | 
|---|
| 141 | . D CHKADDR^XMXADDR(XMDUZ,.XMY,.XMINSTR) | 
|---|
| 142 | . K XMY | 
|---|
| 143 | E  D  Q:XMABORT  ; ask the user for recipients. | 
|---|
| 144 | . D TOWHOM^XMJMT(XMDUZ,$$EZBLD^DIALOG(34110),.XMINSTR,"",.XMABORT) ; send | 
|---|
| 145 | Q | 
|---|
| 146 | READ ; Entry from close-execute of P-MESSAGE entry in TERMINAL TYPE file. | 
|---|
| 147 | ; Read the host file into a message, send it, erase it. | 
|---|
| 148 | ; Read record from file. | 
|---|
| 149 | ; Each time <CR> is found in record it ends a message line. | 
|---|
| 150 | N X,XMNULCNT,XMLEN,XMZZ,XMREC,XMI,XMLIMIT,XMAPHOST,XMINSTR,XMABORT | 
|---|
| 151 | I '$D(^TMP("XM-MESS",$J)) D  Q:XMABORT | 
|---|
| 152 | . D SETUP(.XMAPHOST,.XMABORT) | 
|---|
| 153 | E  D | 
|---|
| 154 | . M ^TMP("XMY",$J)=^TMP("XM-MESS",$J,"XMY") | 
|---|
| 155 | . M ^TMP("XMY0",$J)=^TMP("XM-MESS",$J,"XMY0") | 
|---|
| 156 | . M XMAPHOST=^TMP("XM-MESS",$J,"XMAPHOST") | 
|---|
| 157 | . K ^TMP("XM-MESS",$J) | 
|---|
| 158 | S XMDUZ=XMAPHOST("XMDUZ") | 
|---|
| 159 | M XMV=XMAPHOST("XMV") | 
|---|
| 160 | M XMINSTR=XMAPHOST("XMINSTR") | 
|---|
| 161 | S XMLIMIT=$P($G(^XMB(1,1,.16)),U) ; P-MESSAGE LINE LIMIT | 
|---|
| 162 | S:'XMLIMIT XMLIMIT=999999999999999 | 
|---|
| 163 | D CRE8XMZ^XMXSEND(XMAPHOST("XMSUB"),.XMZZ) | 
|---|
| 164 | I '$D(ZTQUEUED),'$G(XMQUIET) D | 
|---|
| 165 | . U IO(0) | 
|---|
| 166 | . W !,$$EZBLD^DIALOG(34234) ; Moving to MailMan message... | 
|---|
| 167 | . W !,"." | 
|---|
| 168 | U IO | 
|---|
| 169 | S (XMNULCNT,XMI)=0,XMREC="" | 
|---|
| 170 | N $ETRAP,$ESTACK S $ETRAP="D EOFERR^XMAPHOST" | 
|---|
| 171 | F  S XMREC=$$GET() Q:$G(XMAPHOST("EOF"))  D  Q:$G(XMAPHOST("EOF"))!(XMI>XMLIMIT) | 
|---|
| 172 | . I XMREC="" D  Q:$G(XMAPHOST("EOF")) | 
|---|
| 173 | . . S XMNULCNT=XMNULCNT+1 | 
|---|
| 174 | . . Q:XMNULCNT'>250     ; If more than 250 consecutive null lines, | 
|---|
| 175 | . . S XMAPHOST("EOF")=1 ; set EOF and get rid of those null lines. | 
|---|
| 176 | . . F  K ^XMB(3.9,XMZZ,2,XMI,0) S XMI=XMI-1 Q:'XMI  Q:$G(^XMB(3.9,XMZZ,2,XMI,0))'="" | 
|---|
| 177 | . E  S XMNULCNT=0 | 
|---|
| 178 | . S XMLEN=$L(XMREC) | 
|---|
| 179 | . F  D  Q:XMREC=""!$G(XMAPHOST("EOF")) | 
|---|
| 180 | . . D PUT(XMZZ,$P(XMREC,$C(13)),.XMI) | 
|---|
| 181 | . . S XMREC=$P(XMREC,$C(13),2,999) | 
|---|
| 182 | . . Q:XMREC="" | 
|---|
| 183 | . . S:XMLEN>254 XMREC=XMREC_$$GET(),XMLEN=0 | 
|---|
| 184 | D EOF | 
|---|
| 185 | Q | 
|---|
| 186 | GET() ; Read a record from the file | 
|---|
| 187 | N Y,X | 
|---|
| 188 | N $ETRAP,$ESTACK S $ETRAP="S $EC="""" S XMAPHOST(""EOF"")=1 Q """"" | 
|---|
| 189 | R Y#255:1 | 
|---|
| 190 | Q Y | 
|---|
| 191 | PUT(XMZZ,XMREC,XMI) ; Put data into message. | 
|---|
| 192 | S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)=$S(XMREC'?.E1C.E:XMREC,1:$$CTRL^XMXUTIL1(XMREC)) | 
|---|
| 193 | I '$D(ZTQUEUED),'$G(XMQUIET),XMI#10=0 U IO(0) W "." U IO | 
|---|
| 194 | Q | 
|---|
| 195 | EOFERR ; | 
|---|
| 196 | D EOF | 
|---|
| 197 | D UNWIND^%ZTER | 
|---|
| 198 | Q | 
|---|
| 199 | EOF ; | 
|---|
| 200 | S $ETRAP="" | 
|---|
| 201 | I XMI>XMLIMIT D | 
|---|
| 202 | . S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)="" | 
|---|
| 203 | . S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)="*******************************************************************" | 
|---|
| 204 | . S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)=$$EZBLD^DIALOG(34235,XMLIMIT) ; P-MESSAGE line limit of |1| reached. | 
|---|
| 205 | . S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)="*******************************************************************" | 
|---|
| 206 | . Q:$D(ZTQUEUED)!$G(XMQUIET) | 
|---|
| 207 | . U IO(0) W !,$$EZBLD^DIALOG(34235,XMLIMIT),! ; P-MESSAGE line limit of |1| reached. | 
|---|
| 208 | I '$D(ZTQUEUED),'$G(XMQUIET) U IO(0) W !,$$EZBLD^DIALOG(34236) ; Finished moving. | 
|---|
| 209 | S ^XMB(3.9,XMZZ,2,0)="^3.92A^"_XMI_"^"_XMI | 
|---|
| 210 | D SENDMSG(XMDUZ,XMZZ,.XMINSTR) | 
|---|
| 211 | D CLEANUP | 
|---|
| 212 | Q | 
|---|
| 213 | SENDMSG(XMDUZ,XMZ,XMINSTR) ; Here, send the message to recipient. | 
|---|
| 214 | I '$D(ZTQUEUED),'$G(XMQUIET) W !,$$EZBLD^DIALOG(34217,XMZ) ; Sending [_XMZ_]... | 
|---|
| 215 | D MOVEPART^XMXSEND(XMDUZ,XMZ,.XMINSTR) | 
|---|
| 216 | I $D(XMINSTR("FROM")),XMINSTR("FROM")="POSTMASTER"!(XMINSTR("FROM")?.N) S $P(^XMB(3.9,XMZ,0),U,4)=DUZ ; Retain 'sender' | 
|---|
| 217 | I $D(XMINSTR("FROM")),$D(XMINSTR("SELF BSKT")),XMINSTR("SELF BSKT")'=1 D | 
|---|
| 218 | . D FWD^XMKP(XMDUZ,XMZ,.XMINSTR) | 
|---|
| 219 | E  D | 
|---|
| 220 | . D SEND^XMKP(XMDUZ,XMZ,.XMINSTR) | 
|---|
| 221 | I '$D(ZTQUEUED),'$G(XMQUIET) W !,$$EZBLD^DIALOG(34213) ;   Sent | 
|---|
| 222 | D CHECK^XMKPL | 
|---|
| 223 | Q | 
|---|
| 224 | CLEANUP ; | 
|---|
| 225 | S IONOFF=1 ; Prevent form feed during device close | 
|---|
| 226 | D CLEANUP^XMXADDR | 
|---|
| 227 | D KSETS | 
|---|
| 228 | K XMERR,^TMP("XMERR",$J) | 
|---|
| 229 | I $D(XMAPHOST("XMZBACK")) S XMZ=XMZZ | 
|---|
| 230 | Q | 
|---|
| 231 | KSETS ; | 
|---|
| 232 | K:$G(XMAPHOST("SET XMDUZ")) XMDUZ | 
|---|
| 233 | K:$G(XMAPHOST("SET XMV")) XMV,XMDUN,XMNOSEND,XMDISPI,XMPRIV | 
|---|
| 234 | I $D(XMAPHOST("CHG XMDUZ")) S XMDUZ=XMAPHOST("CHG XMDUZ") | 
|---|
| 235 | Q | 
|---|