- XMAPHOST ;ISC-SF/GMB-Print to Message (P-MESSAGE) ;07/29/2003 14:36
- ;;8.0;MailMan;**2,17,21,28,33**;Jun 28, 2002;Build 1
- ;Was (WASH ISC)/KMB/CAP before extensive rework.
- ;
- ;This routine handles printing to P-MESSAGE.
- ;
- ;To print reports to mail messages, we actually write to host files
- ;(DOS,VMS...) and then suck them into mail messages. MailMan works
- ;closely with TaskMan and the device handler to make it happen.
- ;
- ;If a user or application wants to write something to a mail message,
- ;the user should choose (or the application should set ZTIO=) a device
- ;whose name starts with "P-MESSAGE". The user or application can
- ;set the subject of the message, as well as the recipients. The user
- ;does this by responding to MailMan queries, and the application does
- ;this by setting input variables (see below).
- ;
- ;EN^XMAPHOST is called as a pre-open execute for the P-MESSAGE device,
- ;and READ^XMAPHOST is called as a close execute for the P-MESSAGE
- ;terminal type.
- ;
- ;The pre-open execute is there to capture the wishes (message subject,
- ;recipients, and whether to queue or not) of the user working in the
- ;foreground. The global ^TMP("XM-MESS",$J) is created, as a result.
- ;TaskMan looks for this global whenever $E(ZTIO,1,9)="P-MESSAGE", and
- ;includes it in the task, if the user chooses to task the print. This
- ;is a special arrangement that MailMan has with TaskMan.
- ;
- ;If the job printing to P-MESSAGE is running in the background, then
- ;the pre-open execute code does not get executed during the pre-open
- ;execute; instead, it is run as part of the close execute.
- ;
- ;If more than 250 consecutive null lines are encountered, MailMan
- ;assumes EOF has somehow been missed, and stops transferring lines from
- ;the host file to the message.
- ;
- ;This routine has one idiosyncracy. If the report contains one single
- ;line or two lines separated with only a $C(13) instead of a CR/LF that
- ;is more than 254 characters long, there will be unexpected results.
- ;
- ;Variables:
- ;input:
- ; XMDUZ (optional) Sender DUZ or string (default=DUZ)
- ; If XMDUZ is a string, then user will not be asked who the
- ; message should be from.
- ; XMSUB (optional) message subject. If not supplied, then default
- ; subject is "Queued mail report from "<user name>
- ; XMY(x)="" (optional) array of additional addressees to whom the
- ; message should be sent. See documentation for ^XMD for more
- ; info on XMY.
- ; The message will always be sent to XMDUZ (unless XMDUZ is a
- ; string), so it is not necessary to set XMY(XMDUZ)="".
- ; XMQUIET (optional) if $G(XMQUIET), then there is no user interaction
- ; and no information written to the screen.
- ; XMZBACK (optional) if $D(XMZBACK), then XMZ is set upon exit,
- ; and XMZBACK is killed.
- ;output:
- ; XMZ If $D(XMZBACK), then XMZ is set with the IEN of the message,
- ; and XMZBACK is killed; otherwise, XMZ is not set, and
- ; remains whatever it was (or wasn't) before the call.
- ; XMMG If error, may contain error message.
- ; XMV("ERROR") If error, may contain error message.
- ;
- EN ; Entry from pre-open execute of P-MESSAGE entry in DEVICE file.
- ; If the user chooses to queue the print, we don't want this code
- ; (the pre-open execute of the DEVICE file entry) to execute when
- ; the task starts up.
- K ^TMP("XM-MESS",$J)
- N %H
- Q:$D(ZTQUEUED)!$G(XMQUIET)!$D(DDS)
- N XMAPHOST,XMABORT
- D SETUP(.XMAPHOST,.XMABORT) I XMABORT S (POP,DUOUT,%ZISQUIT)=1 K IO("Q") Q
- M ^TMP("XM-MESS",$J,"XMY")=^TMP("XMY",$J)
- M ^TMP("XM-MESS",$J,"XMY0")=^TMP("XMY0",$J)
- M ^TMP("XM-MESS",$J,"XMAPHOST")=XMAPHOST
- D CLEANUP^XMXADDR
- D KSETS
- Q
- SETUP(XMAPHOST,XMABORT) ; Entry during close-execute (called from READ^XMAPHOST)
- N XMINSTR
- S XMABORT=0
- D INIT(.XMDUZ,.XMAPHOST,.XMINSTR,.XMABORT)
- I 'XMABORT D GETSUBJ($S($D(XMAPSUBJ):XMAPSUBJ,$D(XMSUB):XMSUB,1:""),.XMAPHOST,.XMABORT)
- I 'XMABORT D FROMWHOM(XMDUZ,.XMINSTR,.XMABORT)
- I 'XMABORT D ADDRMSG(XMDUZ,.XMINSTR,.XMABORT)
- I 'XMABORT M XMAPHOST("XMINSTR")=XMINSTR Q
- D CLEANUP^XMXADDR
- D KSETS
- Q
- INIT(XMDUZ,XMAPHOST,XMINSTR,XMABORT) ;
- I '$D(XMDUZ) S XMDUZ=DUZ,XMAPHOST("SET XMDUZ")=1 K XMV
- S XMAPHOST("CHG XMDUZ")=XMDUZ
- D SETFROM^XMD(.XMDUZ,.XMINSTR) I $D(XMMG) S XMABORT=1 Q
- I '$D(XMINSTR("FROM")) K XMAPHOST("CHG XMDUZ")
- I '$D(XMV("NAME")) D Q:XMABORT
- . S XMAPHOST("SET XMV")=1
- . D INITAPI^XMVVITAE
- . I $D(XMV("ERROR")) S XMABORT=1 D:'$D(ZTQUEUED) ERROR^XM(.XMV,"ERROR")
- I $D(XMZBACK) S XMAPHOST("XMZBACK")="" K XMZBACK
- S XMAPHOST("XMDUZ")=XMDUZ
- M XMAPHOST("XMV")=XMV
- Q
- GETSUBJ(XMSUBJ,XMAPHOST,XMABORT) ;
- D CHKSUBJ(.XMSUBJ)
- I $D(ZTQUEUED)!$G(XMQUIET) D
- . S XMSUBJ=$G(XMSUBJ,$E($$EZBLD^DIALOG(34233,XMV("NAME")),1,65)) ; queued mail report from |1|
- E D SUBJ^XMJMS(.XMSUBJ,.XMABORT) Q:XMABORT
- S XMAPHOST("XMSUB")=XMSUBJ
- Q
- CHKSUBJ(XMSUBJ) ;
- I XMSUBJ="" K XMSUBJ Q
- K XMERR,^TMP("XMERR",$J)
- I $L(XMSUBJ)<3 S XMSUBJ=XMSUBJ_"..."
- I $L(XMSUBJ)>65 S XMSUBJ=$E(XMSUBJ,1,65)
- S XMSUBJ=$$XMSUBJ^XMXPARM("",XMSUBJ)
- I $D(XMERR) K XMSUBJ,XMERR,^TMP("XMERR",$J)
- Q
- FROMWHOM(XMDUZ,XMINSTR,XMABORT) ;
- I XMDUZ=.5!$D(XMINSTR("FROM")) Q
- N XMFROM
- S XMFROM=$P($G(^XMB(3.7,XMDUZ,16)),U,3)
- I $D(ZTQUEUED)!$G(XMQUIET) D Q
- . I XMFROM="P" S XMINSTR("FROM")="POSTMASTER"
- N DIR,X,Y,XMME,XMPOST
- S DIR("A")=$$EZBLD^DIALOG(34239) ; From whom
- S XMME=$$EZBLD^DIALOG(34240) ; M:Me
- S XMPOST=$$EZBLD^DIALOG(34241) ; P:Postmaster
- S DIR(0)="S^"_XMME_";"_XMPOST
- S DIR("B")=$S(XMFROM="P":$P(XMPOST,":",2,9),1:$P(XMME,":",2,9))
- D BLD^DIALOG(34242,"","","DIR(""?"")") ; Answer 'Me' if the message should be from...
- D ^DIR I $D(DIRUT) S XMABORT=1 Q
- I Y=$P(XMPOST,":",1) S XMINSTR("FROM")="POSTMASTER"
- Q
- ADDRMSG(XMDUZ,XMINSTR,XMABORT) ;
- ;I '$D(ZTQUEUED),'$G(XMQUIET) K XMY,XMY0
- D INIT^XMXADDR
- K XMERR,^TMP("XMERR",$J)
- I $D(ZTQUEUED)!$G(XMQUIET) D
- . I '$D(XMAPHOST("CHG XMDUZ")) S XMY(XMDUZ)=""
- . D CHKBSKT^XMD(.XMY,.XMINSTR)
- . D CHKADDR^XMXADDR(XMDUZ,.XMY,.XMINSTR)
- . K XMY
- E D Q:XMABORT ; ask the user for recipients.
- . D TOWHOM^XMJMT(XMDUZ,$$EZBLD^DIALOG(34110),.XMINSTR,"",.XMABORT) ; send
- Q
- READ ; Entry from close-execute of P-MESSAGE entry in TERMINAL TYPE file.
- ; Read the host file into a message, send it, erase it.
- ; Read record from file.
- ; Each time <CR> is found in record it ends a message line.
- N X,XMNULCNT,XMLEN,XMZZ,XMREC,XMI,XMLIMIT,XMAPHOST,XMINSTR,XMABORT
- I '$D(^TMP("XM-MESS",$J)) D Q:XMABORT
- . D SETUP(.XMAPHOST,.XMABORT)
- E D
- . M ^TMP("XMY",$J)=^TMP("XM-MESS",$J,"XMY")
- . M ^TMP("XMY0",$J)=^TMP("XM-MESS",$J,"XMY0")
- . M XMAPHOST=^TMP("XM-MESS",$J,"XMAPHOST")
- . K ^TMP("XM-MESS",$J)
- S XMDUZ=XMAPHOST("XMDUZ")
- M XMV=XMAPHOST("XMV")
- M XMINSTR=XMAPHOST("XMINSTR")
- S XMLIMIT=$P($G(^XMB(1,1,.16)),U) ; P-MESSAGE LINE LIMIT
- S:'XMLIMIT XMLIMIT=999999999999999
- D CRE8XMZ^XMXSEND(XMAPHOST("XMSUB"),.XMZZ)
- I '$D(ZTQUEUED),'$G(XMQUIET) D
- . U IO(0)
- . W !,$$EZBLD^DIALOG(34234) ; Moving to MailMan message...
- . W !,"."
- U IO
- S (XMNULCNT,XMI)=0,XMREC=""
- N $ETRAP,$ESTACK S $ETRAP="D EOFERR^XMAPHOST"
- F S XMREC=$$GET() Q:$G(XMAPHOST("EOF")) D Q:$G(XMAPHOST("EOF"))!(XMI>XMLIMIT)
- . I XMREC="" D Q:$G(XMAPHOST("EOF"))
- . . S XMNULCNT=XMNULCNT+1
- . . Q:XMNULCNT'>250 ; If more than 250 consecutive null lines,
- . . S XMAPHOST("EOF")=1 ; set EOF and get rid of those null lines.
- . . F K ^XMB(3.9,XMZZ,2,XMI,0) S XMI=XMI-1 Q:'XMI Q:$G(^XMB(3.9,XMZZ,2,XMI,0))'=""
- . E S XMNULCNT=0
- . S XMLEN=$L(XMREC)
- . F D Q:XMREC=""!$G(XMAPHOST("EOF"))
- . . D PUT(XMZZ,$P(XMREC,$C(13)),.XMI)
- . . S XMREC=$P(XMREC,$C(13),2,999)
- . . Q:XMREC=""
- . . S:XMLEN>254 XMREC=XMREC_$$GET(),XMLEN=0
- D EOF
- Q
- GET() ; Read a record from the file
- N Y,X
- N $ETRAP,$ESTACK S $ETRAP="S $EC="""" S XMAPHOST(""EOF"")=1 Q """""
- R Y#255:1
- Q Y
- PUT(XMZZ,XMREC,XMI) ; Put data into message.
- S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)=$S(XMREC'?.E1C.E:XMREC,1:$$CTRL^XMXUTIL1(XMREC))
- I '$D(ZTQUEUED),'$G(XMQUIET),XMI#10=0 U IO(0) W "." U IO
- Q
- EOFERR ;
- D EOF
- D UNWIND^%ZTER
- Q
- EOF ;
- S $ETRAP=""
- I XMI>XMLIMIT D
- . S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)=""
- . S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)="*******************************************************************"
- . S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)=$$EZBLD^DIALOG(34235,XMLIMIT) ; P-MESSAGE line limit of |1| reached.
- . S XMI=XMI+1,^XMB(3.9,XMZZ,2,XMI,0)="*******************************************************************"
- . Q:$D(ZTQUEUED)!$G(XMQUIET)
- . U IO(0) W !,$$EZBLD^DIALOG(34235,XMLIMIT),! ; P-MESSAGE line limit of |1| reached.
- I '$D(ZTQUEUED),'$G(XMQUIET) U IO(0) W !,$$EZBLD^DIALOG(34236) ; Finished moving.
- S ^XMB(3.9,XMZZ,2,0)="^3.92A^"_XMI_"^"_XMI
- D SENDMSG(XMDUZ,XMZZ,.XMINSTR)
- D CLEANUP
- Q
- SENDMSG(XMDUZ,XMZ,XMINSTR) ; Here, send the message to recipient.
- I '$D(ZTQUEUED),'$G(XMQUIET) W !,$$EZBLD^DIALOG(34217,XMZ) ; Sending [_XMZ_]...
- D MOVEPART^XMXSEND(XMDUZ,XMZ,.XMINSTR)
- I $D(XMINSTR("FROM")),XMINSTR("FROM")="POSTMASTER"!(XMINSTR("FROM")?.N) S $P(^XMB(3.9,XMZ,0),U,4)=DUZ ; Retain 'sender'
- I $D(XMINSTR("FROM")),$D(XMINSTR("SELF BSKT")),XMINSTR("SELF BSKT")'=1 D
- . D FWD^XMKP(XMDUZ,XMZ,.XMINSTR)
- E D
- . D SEND^XMKP(XMDUZ,XMZ,.XMINSTR)
- I '$D(ZTQUEUED),'$G(XMQUIET) W !,$$EZBLD^DIALOG(34213) ; Sent
- D CHECK^XMKPL
- Q
- CLEANUP ;
- S IONOFF=1 ; Prevent form feed during device close
- D CLEANUP^XMXADDR
- D KSETS
- K XMERR,^TMP("XMERR",$J)
- I $D(XMAPHOST("XMZBACK")) S XMZ=XMZZ
- Q
- KSETS ;
- K:$G(XMAPHOST("SET XMDUZ")) XMDUZ
- K:$G(XMAPHOST("SET XMV")) XMV,XMDUN,XMNOSEND,XMDISPI,XMPRIV
- I $D(XMAPHOST("CHG XMDUZ")) S XMDUZ=XMAPHOST("CHG XMDUZ")
- Q
- XMAPHOST ;ISC-SF/GMB-Print to Message (P-MESSAGE) ;07/29/2003 14:36
- +1 ;;8.0;MailMan;**2,17,21,28,33**;Jun 28, 2002;Build 1
- +2 ;Was (WASH ISC)/KMB/CAP before extensive rework.
- +3 ;
- +4 ;This routine handles printing to P-MESSAGE.
- +5 ;
- +6 ;To print reports to mail messages, we actually write to host files
- +7 ;(DOS,VMS...) and then suck them into mail messages. MailMan works
- +8 ;closely with TaskMan and the device handler to make it happen.
- +9 ;
- +10 ;If a user or application wants to write something to a mail message,
- +11 ;the user should choose (or the application should set ZTIO=) a device
- +12 ;whose name starts with "P-MESSAGE". The user or application can
- +13 ;set the subject of the message, as well as the recipients. The user
- +14 ;does this by responding to MailMan queries, and the application does
- +15 ;this by setting input variables (see below).
- +16 ;
- +17 ;EN^XMAPHOST is called as a pre-open execute for the P-MESSAGE device,
- +18 ;and READ^XMAPHOST is called as a close execute for the P-MESSAGE
- +19 ;terminal type.
- +20 ;
- +21 ;The pre-open execute is there to capture the wishes (message subject,
- +22 ;recipients, and whether to queue or not) of the user working in the
- +23 ;foreground. The global ^TMP("XM-MESS",$J) is created, as a result.
- +24 ;TaskMan looks for this global whenever $E(ZTIO,1,9)="P-MESSAGE", and
- +25 ;includes it in the task, if the user chooses to task the print. This
- +26 ;is a special arrangement that MailMan has with TaskMan.
- +27 ;
- +28 ;If the job printing to P-MESSAGE is running in the background, then
- +29 ;the pre-open execute code does not get executed during the pre-open
- +30 ;execute; instead, it is run as part of the close execute.
- +31 ;
- +32 ;If more than 250 consecutive null lines are encountered, MailMan
- +33 ;assumes EOF has somehow been missed, and stops transferring lines from
- +34 ;the host file to the message.
- +35 ;
- +36 ;This routine has one idiosyncracy. If the report contains one single
- +37 ;line or two lines separated with only a $C(13) instead of a CR/LF that
- +38 ;is more than 254 characters long, there will be unexpected results.
- +39 ;
- +40 ;Variables:
- +41 ;input:
- +42 ; XMDUZ (optional) Sender DUZ or string (default=DUZ)
- +43 ; If XMDUZ is a string, then user will not be asked who the
- +44 ; message should be from.
- +45 ; XMSUB (optional) message subject. If not supplied, then default
- +46 ; subject is "Queued mail report from "<user name>
- +47 ; XMY(x)="" (optional) array of additional addressees to whom the
- +48 ; message should be sent. See documentation for ^XMD for more
- +49 ; info on XMY.
- +50 ; The message will always be sent to XMDUZ (unless XMDUZ is a
- +51 ; string), so it is not necessary to set XMY(XMDUZ)="".
- +52 ; XMQUIET (optional) if $G(XMQUIET), then there is no user interaction
- +53 ; and no information written to the screen.
- +54 ; XMZBACK (optional) if $D(XMZBACK), then XMZ is set upon exit,
- +55 ; and XMZBACK is killed.
- +56 ;output:
- +57 ; XMZ If $D(XMZBACK), then XMZ is set with the IEN of the message,
- +58 ; and XMZBACK is killed; otherwise, XMZ is not set, and
- +59 ; remains whatever it was (or wasn't) before the call.
- +60 ; XMMG If error, may contain error message.
- +61 ; XMV("ERROR") If error, may contain error message.
- +62 ;
- EN ; Entry from pre-open execute of P-MESSAGE entry in DEVICE file.
- +1 ; If the user chooses to queue the print, we don't want this code
- +2 ; (the pre-open execute of the DEVICE file entry) to execute when
- +3 ; the task starts up.
- +4 KILL ^TMP("XM-MESS",$JOB)
- +5 NEW %H
- +6 IF $DATA(ZTQUEUED)!$GET(XMQUIET)!$DATA(DDS)
- QUIT
- +7 NEW XMAPHOST,XMABORT
- +8 DO SETUP(.XMAPHOST,.XMABORT)
- IF XMABORT
- SET (POP,DUOUT,%ZISQUIT)=1
- KILL IO("Q")
- QUIT
- +9 MERGE ^TMP("XM-MESS",$JOB,"XMY")=^TMP("XMY",$JOB)
- +10 MERGE ^TMP("XM-MESS",$JOB,"XMY0")=^TMP("XMY0",$JOB)
- +11 MERGE ^TMP("XM-MESS",$JOB,"XMAPHOST")=XMAPHOST
- +12 DO CLEANUP^XMXADDR
- +13 DO KSETS
- +14 QUIT
- SETUP(XMAPHOST,XMABORT) ; Entry during close-execute (called from READ^XMAPHOST)
- +1 NEW XMINSTR
- +2 SET XMABORT=0
- +3 DO INIT(.XMDUZ,.XMAPHOST,.XMINSTR,.XMABORT)
- +4 IF 'XMABORT
- DO GETSUBJ($SELECT($DATA(XMAPSUBJ):XMAPSUBJ,$DATA(XMSUB):XMSUB,1:""),.XMAPHOST,.XMABORT)
- +5 IF 'XMABORT
- DO FROMWHOM(XMDUZ,.XMINSTR,.XMABORT)
- +6 IF 'XMABORT
- DO ADDRMSG(XMDUZ,.XMINSTR,.XMABORT)
- +7 IF 'XMABORT
- MERGE XMAPHOST("XMINSTR")=XMINSTR
- QUIT
- +8 DO CLEANUP^XMXADDR
- +9 DO KSETS
- +10 QUIT
- INIT(XMDUZ,XMAPHOST,XMINSTR,XMABORT) ;
- +1 IF '$DATA(XMDUZ)
- SET XMDUZ=DUZ
- SET XMAPHOST("SET XMDUZ")=1
- KILL XMV
- +2 SET XMAPHOST("CHG XMDUZ")=XMDUZ
- +3 DO SETFROM^XMD(.XMDUZ,.XMINSTR)
- IF $DATA(XMMG)
- SET XMABORT=1
- QUIT
- +4 IF '$DATA(XMINSTR("FROM"))
- KILL XMAPHOST("CHG XMDUZ")
- +5 IF '$DATA(XMV("NAME"))
- Begin DoDot:1
- +6 SET XMAPHOST("SET XMV")=1
- +7 DO INITAPI^XMVVITAE
- +8 IF $DATA(XMV("ERROR"))
- SET XMABORT=1
- IF '$DATA(ZTQUEUED)
- DO ERROR^XM(.XMV,"ERROR")
- End DoDot:1
- IF XMABORT
- QUIT
- +9 IF $DATA(XMZBACK)
- SET XMAPHOST("XMZBACK")=""
- KILL XMZBACK
- +10 SET XMAPHOST("XMDUZ")=XMDUZ
- +11 MERGE XMAPHOST("XMV")=XMV
- +12 QUIT
- GETSUBJ(XMSUBJ,XMAPHOST,XMABORT) ;
- +1 DO CHKSUBJ(.XMSUBJ)
- +2 IF $DATA(ZTQUEUED)!$GET(XMQUIET)
- Begin DoDot:1
- +3 ; queued mail report from |1|
- SET XMSUBJ=$GET(XMSUBJ,$EXTRACT($$EZBLD^DIALOG(34233,XMV("NAME")),1,65))
- End DoDot:1
- +4 IF '$TEST
- DO SUBJ^XMJMS(.XMSUBJ,.XMABORT)
- IF XMABORT
- QUIT
- +5 SET XMAPHOST("XMSUB")=XMSUBJ
- +6 QUIT
- CHKSUBJ(XMSUBJ) ;
- +1 IF XMSUBJ=""
- KILL XMSUBJ
- QUIT
- +2 KILL XMERR,^TMP("XMERR",$JOB)
- +3 IF $LENGTH(XMSUBJ)<3
- SET XMSUBJ=XMSUBJ_"..."
- +4 IF $LENGTH(XMSUBJ)>65
- SET XMSUBJ=$EXTRACT(XMSUBJ,1,65)
- +5 SET XMSUBJ=$$XMSUBJ^XMXPARM("",XMSUBJ)
- +6 IF $DATA(XMERR)
- KILL XMSUBJ,XMERR,^TMP("XMERR",$JOB)
- +7 QUIT
- FROMWHOM(XMDUZ,XMINSTR,XMABORT) ;
- +1 IF XMDUZ=.5!$DATA(XMINSTR("FROM"))
- QUIT
- +2 NEW XMFROM
- +3 SET XMFROM=$PIECE($GET(^XMB(3.7,XMDUZ,16)),U,3)
- +4 IF $DATA(ZTQUEUED)!$GET(XMQUIET)
- Begin DoDot:1
- +5 IF XMFROM="P"
- SET XMINSTR("FROM")="POSTMASTER"
- End DoDot:1
- QUIT
- +6 NEW DIR,X,Y,XMME,XMPOST
- +7 ; From whom
- SET DIR("A")=$$EZBLD^DIALOG(34239)
- +8 ; M:Me
- SET XMME=$$EZBLD^DIALOG(34240)
- +9 ; P:Postmaster
- SET XMPOST=$$EZBLD^DIALOG(34241)
- +10 SET DIR(0)="S^"_XMME_";"_XMPOST
- +11 SET DIR("B")=$SELECT(XMFROM="P":$PIECE(XMPOST,":",2,9),1:$PIECE(XMME,":",2,9))
- +12 ; Answer 'Me' if the message should be from...
- DO BLD^DIALOG(34242,"","","DIR(""?"")")
- +13 DO ^DIR
- IF $DATA(DIRUT)
- SET XMABORT=1
- QUIT
- +14 IF Y=$PIECE(XMPOST,":",1)
- SET XMINSTR("FROM")="POSTMASTER"
- +15 QUIT
- ADDRMSG(XMDUZ,XMINSTR,XMABORT) ;
- +1 ;I '$D(ZTQUEUED),'$G(XMQUIET) K XMY,XMY0
- +2 DO INIT^XMXADDR
- +3 KILL XMERR,^TMP("XMERR",$JOB)
- +4 IF $DATA(ZTQUEUED)!$GET(XMQUIET)
- Begin DoDot:1
- +5 IF '$DATA(XMAPHOST("CHG XMDUZ"))
- SET XMY(XMDUZ)=""
- +6 DO CHKBSKT^XMD(.XMY,.XMINSTR)
- +7 DO CHKADDR^XMXADDR(XMDUZ,.XMY,.XMINSTR)
- +8 KILL XMY
- End DoDot:1
- +9 ; ask the user for recipients.
- IF '$TEST
- Begin DoDot:1
- +10 ; send
- DO TOWHOM^XMJMT(XMDUZ,$$EZBLD^DIALOG(34110),.XMINSTR,"",.XMABORT)
- End DoDot:1
- IF XMABORT
- QUIT
- +11 QUIT
- READ ; Entry from close-execute of P-MESSAGE entry in TERMINAL TYPE file.
- +1 ; Read the host file into a message, send it, erase it.
- +2 ; Read record from file.
- +3 ; Each time <CR> is found in record it ends a message line.
- +4 NEW X,XMNULCNT,XMLEN,XMZZ,XMREC,XMI,XMLIMIT,XMAPHOST,XMINSTR,XMABORT
- +5 IF '$DATA(^TMP("XM-MESS",$JOB))
- Begin DoDot:1
- +6 DO SETUP(.XMAPHOST,.XMABORT)
- End DoDot:1
- IF XMABORT
- QUIT
- +7 IF '$TEST
- Begin DoDot:1
- +8 MERGE ^TMP("XMY",$JOB)=^TMP("XM-MESS",$JOB,"XMY")
- +9 MERGE ^TMP("XMY0",$JOB)=^TMP("XM-MESS",$JOB,"XMY0")
- +10 MERGE XMAPHOST=^TMP("XM-MESS",$JOB,"XMAPHOST")
- +11 KILL ^TMP("XM-MESS",$JOB)
- End DoDot:1
- +12 SET XMDUZ=XMAPHOST("XMDUZ")
- +13 MERGE XMV=XMAPHOST("XMV")
- +14 MERGE XMINSTR=XMAPHOST("XMINSTR")
- +15 ; P-MESSAGE LINE LIMIT
- SET XMLIMIT=$PIECE($GET(^XMB(1,1,.16)),U)
- +16 IF 'XMLIMIT
- SET XMLIMIT=999999999999999
- +17 DO CRE8XMZ^XMXSEND(XMAPHOST("XMSUB"),.XMZZ)
- +18 IF '$DATA(ZTQUEUED)
- IF '$GET(XMQUIET)
- Begin DoDot:1
- +19 USE IO(0)
- +20 ; Moving to MailMan message...
- WRITE !,$$EZBLD^DIALOG(34234)
- +21 WRITE !,"."
- End DoDot:1
- +22 USE IO
- +23 SET (XMNULCNT,XMI)=0
- SET XMREC=""
- +24 NEW $ETRAP,$ESTACK
- SET $ETRAP="D EOFERR^XMAPHOST"
- +25 FOR
- SET XMREC=$$GET()
- IF $GET(XMAPHOST("EOF"))
- QUIT
- Begin DoDot:1
- +26 IF XMREC=""
- Begin DoDot:2
- +27 SET XMNULCNT=XMNULCNT+1
- +28 ; If more than 250 consecutive null lines,
- IF XMNULCNT'>250
- QUIT
- +29 ; set EOF and get rid of those null lines.
- SET XMAPHOST("EOF")=1
- +30 FOR
- KILL ^XMB(3.9,XMZZ,2,XMI,0)
- SET XMI=XMI-1
- IF 'XMI
- QUIT
- IF $GET(^XMB(3.9,XMZZ,2,XMI,0))'=""
- QUIT
- End DoDot:2
- IF $GET(XMAPHOST("EOF"))
- QUIT
- +31 IF '$TEST
- SET XMNULCNT=0
- +32 SET XMLEN=$LENGTH(XMREC)
- +33 FOR
- Begin DoDot:2
- +34 DO PUT(XMZZ,$PIECE(XMREC,$CHAR(13)),.XMI)
- +35 SET XMREC=$PIECE(XMREC,$CHAR(13),2,999)
- +36 IF XMREC=""
- QUIT
- +37 IF XMLEN>254
- SET XMREC=XMREC_$$GET()
- SET XMLEN=0
- End DoDot:2
- IF XMREC=""!$GET(XMAPHOST("EOF"))
- QUIT
- End DoDot:1
- IF $GET(XMAPHOST("EOF"))!(XMI>XMLIMIT)
- QUIT
- +38 DO EOF
- +39 QUIT
- GET() ; Read a record from the file
- +1 NEW Y,X
- +2 NEW $ETRAP,$ESTACK
- SET $ETRAP="S $EC="""" S XMAPHOST(""EOF"")=1 Q """""
- +3 READ Y#255:1
- +4 QUIT Y
- PUT(XMZZ,XMREC,XMI) ; Put data into message.
- +1 SET XMI=XMI+1
- SET ^XMB(3.9,XMZZ,2,XMI,0)=$SELECT(XMREC'?.E1C.E:XMREC,1:$$CTRL^XMXUTIL1(XMREC))
- +2 IF '$DATA(ZTQUEUED)
- IF '$GET(XMQUIET)
- IF XMI#10=0
- USE IO(0)
- WRITE "."
- USE IO
- +3 QUIT
- EOFERR ;
- +1 DO EOF
- +2 DO UNWIND^%ZTER
- +3 QUIT
- EOF ;
- +1 SET $ETRAP=""
- +2 IF XMI>XMLIMIT
- Begin DoDot:1
- +3 SET XMI=XMI+1
- SET ^XMB(3.9,XMZZ,2,XMI,0)=""
- +4 SET XMI=XMI+1
- SET ^XMB(3.9,XMZZ,2,XMI,0)="*******************************************************************"
- +5 ; P-MESSAGE line limit of |1| reached.
- SET XMI=XMI+1
- SET ^XMB(3.9,XMZZ,2,XMI,0)=$$EZBLD^DIALOG(34235,XMLIMIT)
- +6 SET XMI=XMI+1
- SET ^XMB(3.9,XMZZ,2,XMI,0)="*******************************************************************"
- +7 IF $DATA(ZTQUEUED)!$GET(XMQUIET)
- QUIT
- +8 ; P-MESSAGE line limit of |1| reached.
- USE IO(0)
- WRITE !,$$EZBLD^DIALOG(34235,XMLIMIT),!
- End DoDot:1
- +9 ; Finished moving.
- IF '$DATA(ZTQUEUED)
- IF '$GET(XMQUIET)
- USE IO(0)
- WRITE !,$$EZBLD^DIALOG(34236)
- +10 SET ^XMB(3.9,XMZZ,2,0)="^3.92A^"_XMI_"^"_XMI
- +11 DO SENDMSG(XMDUZ,XMZZ,.XMINSTR)
- +12 DO CLEANUP
- +13 QUIT
- SENDMSG(XMDUZ,XMZ,XMINSTR) ; Here, send the message to recipient.
- +1 ; Sending [_XMZ_]...
- IF '$DATA(ZTQUEUED)
- IF '$GET(XMQUIET)
- WRITE !,$$EZBLD^DIALOG(34217,XMZ)
- +2 DO MOVEPART^XMXSEND(XMDUZ,XMZ,.XMINSTR)
- +3 ; Retain 'sender'
- IF $DATA(XMINSTR("FROM"))
- IF XMINSTR("FROM")="POSTMASTER"!(XMINSTR("FROM")?.N)
- SET $PIECE(^XMB(3.9,XMZ,0),U,4)=DUZ
- +4 IF $DATA(XMINSTR("FROM"))
- IF $DATA(XMINSTR("SELF BSKT"))
- IF XMINSTR("SELF BSKT")'=1
- Begin DoDot:1
- +5 DO FWD^XMKP(XMDUZ,XMZ,.XMINSTR)
- End DoDot:1
- +6 IF '$TEST
- Begin DoDot:1
- +7 DO SEND^XMKP(XMDUZ,XMZ,.XMINSTR)
- End DoDot:1
- +8 ; Sent
- IF '$DATA(ZTQUEUED)
- IF '$GET(XMQUIET)
- WRITE !,$$EZBLD^DIALOG(34213)
- +9 DO CHECK^XMKPL
- +10 QUIT
- CLEANUP ;
- +1 ; Prevent form feed during device close
- SET IONOFF=1
- +2 DO CLEANUP^XMXADDR
- +3 DO KSETS
- +4 KILL XMERR,^TMP("XMERR",$JOB)
- +5 IF $DATA(XMAPHOST("XMZBACK"))
- SET XMZ=XMZZ
- +6 QUIT
- KSETS ;
- +1 IF $GET(XMAPHOST("SET XMDUZ"))
- KILL XMDUZ
- +2 IF $GET(XMAPHOST("SET XMV"))
- KILL XMV,XMDUN,XMNOSEND,XMDISPI,XMPRIV
- +3 IF $DATA(XMAPHOST("CHG XMDUZ"))
- SET XMDUZ=XMAPHOST("CHG XMDUZ")
- +4 QUIT