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