1 | XMXSEND ;ISC-SF/GMB-Send a msg ;06/19/2002 07:01
|
---|
2 | ;;8.0;MailMan;;Jun 28, 2002
|
---|
3 | ; Entry points:
|
---|
4 | ; SENDMSG Send a message
|
---|
5 | ; CRE8XMZ Setup a message. (1st part of 3-part message sending process)
|
---|
6 | ; In the second part, the programmer directly sets the message
|
---|
7 | ; text into the global.
|
---|
8 | ; ADDRNSND Send the message created by CRE8XMZ and 'texted' by the
|
---|
9 | ; programmer. (3rd part of 3-part message sending process)
|
---|
10 | ; Involves checking the addressees, loading the message,
|
---|
11 | ; putting the addressees in the message,
|
---|
12 | ; and sending the message.
|
---|
13 | ; LATER TaskMan entry point to send a 'later'd message
|
---|
14 | SENDMSG(XMDUZ,XMSUBJ,XMBODY,XMTO,XMINSTR,XMZ,XMATTACH) ;
|
---|
15 | ; XMDUZ DUZ of who the msg is from
|
---|
16 | ; XMSUBJ Subject of the msg
|
---|
17 | ; XMBODY Body of the msg
|
---|
18 | ; Must be closed root, passed by value. See WP_ROOT
|
---|
19 | ; definition for WP^DIE(), FM word processing filer.
|
---|
20 | ; XMTO Addressees
|
---|
21 | ; XMINSTR("SELF BSKT") Basket to deliver to if sender is recipient
|
---|
22 | ; XMINSTR("SHARE DATE") Delete date if recipient is "SHARED,MAIL"
|
---|
23 | ; XMINSTR("SHARE BSKT") Basket if recipient is "SHARED,MAIL"
|
---|
24 | ; XMINSTR("RCPT BSKT") Basket name (only) to deliver to for other recipients
|
---|
25 | ; XMINSTR("VAPOR") Date on which to vaporize (delete) this message
|
---|
26 | ; from recipient baskets
|
---|
27 | ; XMINSTR("LATER") Date on which to send this msg, if not now
|
---|
28 | ; XMINSTR("FROM") String saying from whom (default is user)
|
---|
29 | ; XMINSTR("FLAGS") Any or all of the following:
|
---|
30 | ; P Priority
|
---|
31 | ; I Information only (may not be replied to)
|
---|
32 | ; X Closed msg (may not be forwarded)
|
---|
33 | ; C Confidential (surrogates may not read)
|
---|
34 | ; S Send to sender (make sender a recipient)
|
---|
35 | ; R Confirm receipt
|
---|
36 | ; XMINSTR("SCR KEY") Scramble key (implies that msg should be scrambled)
|
---|
37 | ; XMINSTR("SCR HINT") Hint (to guess the scramble key)
|
---|
38 | ; XMINSTR("STRIP") String containing characters to strip from the message text
|
---|
39 | ; XMINSTR("TYPE") Msg type is one of the following:
|
---|
40 | ; D Document (NOT IMPLEMENTED)
|
---|
41 | ; S Spooled Document (NOT IMPLEMENTED)
|
---|
42 | ; X DIFROM (NOT IMPLEMENTED)
|
---|
43 | ; O ODIF (NOT IMPLEMENTED)
|
---|
44 | ; B BLOB
|
---|
45 | ; K KIDS (NOT IMPLEMENTED)
|
---|
46 | ; XMINSTR("ADDR FLAGS") Any or all of the following:
|
---|
47 | ; I Do not Initialize (kill) the ^TMP addressee global
|
---|
48 | ; R Do not Restrict addressees
|
---|
49 | ; XMZ (out) msg number in ^XMB(3.9 (BUT IF $D(XMINSTR("LATER")),
|
---|
50 | ; then XMZ contains the task number)
|
---|
51 | ; XMATTACH (in) Array of files to attach to message
|
---|
52 | ; ("IMAGE",x) imaging (BLOB) files
|
---|
53 | ; ("ROU",x) routines (NOT IMPLEMENTED)
|
---|
54 | K XMERR,^TMP("XMERR",$J)
|
---|
55 | Q:'$$SEND^XMXSEC(XMDUZ,.XMINSTR)
|
---|
56 | I $D(XMINSTR("LATER")) D Q
|
---|
57 | . N XMTASK
|
---|
58 | . D PSNDLATR(XMDUZ,XMSUBJ,XMBODY,.XMTO,.XMINSTR,.XMTASK,.XMATTACH)
|
---|
59 | . I $D(XMTASK) S XMZ=XMTASK
|
---|
60 | D CRE8XMZ(XMSUBJ,.XMZ) Q:$D(XMERR) ; Create a place for the msg in the msg file
|
---|
61 | D:$D(XMATTACH("IMAGE"))>9 ADDBLOB(XMZ,.XMATTACH) Q:$D(XMERR)
|
---|
62 | D MOVEBODY(XMZ,XMBODY) ; Put the msg body in place
|
---|
63 | D CHEKBODY(XMZ,$G(XMINSTR("STRIP")))
|
---|
64 | D ADDRNSND(XMDUZ,XMZ,.XMTO,.XMINSTR)
|
---|
65 | Q
|
---|
66 | ADDRNSND(XMDUZ,XMZ,XMTO,XMINSTR) ;
|
---|
67 | D CHEKADDR(XMDUZ,XMZ,.XMTO,.XMINSTR)
|
---|
68 | D BLDNSND(XMDUZ,XMZ,.XMINSTR)
|
---|
69 | D CLEANUP^XMXADDR
|
---|
70 | Q
|
---|
71 | CHEKADDR(XMDUZ,XMZ,XMTO,XMINSTR) ;
|
---|
72 | N XMRESTR
|
---|
73 | D:$G(XMINSTR("ADDR FLAGS"))'["I" INIT^XMXADDR
|
---|
74 | D:$G(XMINSTR("ADDR FLAGS"))'["R" CHKLINES^XMXSEC1(XMDUZ,XMZ,.XMRESTR)
|
---|
75 | D:$G(XMINSTR("FLAGS"))["S" CHKADDR^XMXADDR(XMDUZ,XMDUZ)
|
---|
76 | D CHKADDR^XMXADDR(XMDUZ,.XMTO,.XMINSTR,.XMRESTR) ; Address the msg
|
---|
77 | Q
|
---|
78 | BLDNSND(XMDUZ,XMZ,XMINSTR) ;
|
---|
79 | D MOVEPART(XMDUZ,XMZ,.XMINSTR) ; Put various parts of the msg in place
|
---|
80 | I '$$GOTADDR^XMXADDR D ERRSET^XMXUTIL(34100) Q ; No addressees. Message not sent.
|
---|
81 | D SEND^XMKP(XMDUZ,XMZ,.XMINSTR) ; Send the msg
|
---|
82 | D CHECK^XMKPL
|
---|
83 | Q
|
---|
84 | ADDBLOB(XMZ,XMATTACH) ;
|
---|
85 | N X,XMYBLOB,%X,%Y
|
---|
86 | S %X="XMATTACH(""IMAGE"",",%Y="XMYBLOB(" D %XY^%RCR
|
---|
87 | S X=$$MULTI^XMBBLOB(XMZ)
|
---|
88 | Q:'X
|
---|
89 | S XMERR=$G(XMERR)+1,^TMP("XMERR",$J,XMERR,"TEXT",1)="Error with $$MULTI^XMBBLOB"
|
---|
90 | D KILLMSG^XMXUTIL(XMZ)
|
---|
91 | Q
|
---|
92 | CRE8XMZ(XMSUBJ,XMZ,XMIA) ; Create a place for the msg in the msg file
|
---|
93 | N XMFDA,XMIEN,XMMAXDIG,XMRESET
|
---|
94 | I XMSUBJ[U S XMSUBJ=$$ENCODEUP^XMXUTIL1(XMSUBJ)
|
---|
95 | S XMMAXDIG=$P($G(^XMB(1,1,.17),8),U,1) I 'XMMAXDIG S XMMAXDIG=8
|
---|
96 | S XMRESET=0
|
---|
97 | TRYXMZ ;
|
---|
98 | S XMFDA(3.9,"+1,",.01)=XMSUBJ
|
---|
99 | S XMFDA(3.9,"+1,",31)=DT ; local create date
|
---|
100 | D UPDATE^DIE("","XMFDA","XMIEN")
|
---|
101 | I $D(DIERR) D Q
|
---|
102 | . S XMZ=-1
|
---|
103 | . ; Call to UPDATE^DIE failed. Can't get a message number.
|
---|
104 | . ; Here's the error returned by FileMan:
|
---|
105 | . D ERRSET^XMXUTIL(34107)
|
---|
106 | . N I,J,K
|
---|
107 | . S J=0
|
---|
108 | . S I=$O(^TMP("XMERR",$J,XMERR,"TEXT",":"),-1)
|
---|
109 | . F K=1:1:+DIERR D
|
---|
110 | . . F S J=$O(^TMP("DIERR",$J,K,"TEXT",J)) Q:'J D
|
---|
111 | . . . S I=I+1,^TMP("XMERR",$J,XMERR,"TEXT",I)=^TMP("DIERR",$J,K,"TEXT",J)
|
---|
112 | . Q:'$G(XMIA)!$D(ZTQUEUED)
|
---|
113 | . D SHOW^XMJERR
|
---|
114 | . D WAIT^XMXUTIL
|
---|
115 | S XMZ=XMIEN(1)
|
---|
116 | Q:$L(XMZ)'>XMMAXDIG
|
---|
117 | I XMRESET S $P(^XMB(1,1,.17),U,1)=$L(XMZ) Q
|
---|
118 | ; Recycle message numbers, because this one's too big...
|
---|
119 | K XMIEN
|
---|
120 | S XMRESET=1
|
---|
121 | I '$D(^XMB(3.9,99999,0)) D
|
---|
122 | . ; We do this so that if message 100000 is created and then deleted,
|
---|
123 | . ; FM will set piece 3 of ^XMB(3.9,0) to 99999. We don't want any
|
---|
124 | . ; message number lower than 100000 to be created, so that message
|
---|
125 | . ; numbers can't be confused with message sequence numbers in baskets
|
---|
126 | . S ^XMB(3.9,99999,0)="place holder"
|
---|
127 | . S ^XMB(3.9,"B","place holder",99999)=""
|
---|
128 | L +^XMB(3.9,0):1
|
---|
129 | I $L($P(^XMB(3.9,0),U,3))>XMMAXDIG S $P(^XMB(3.9,0),U,3)=99999
|
---|
130 | N DIK,DA S DIK="^XMB(3.9,",DA=XMZ D ^DIK ; Delete the message stub.
|
---|
131 | L -^XMB(3.9,0)
|
---|
132 | G TRYXMZ ; Go get another
|
---|
133 | MOVEBODY(XMZ,XMBODY,XMFLAG) ;
|
---|
134 | D WP^DIE(3.9,XMZ_",",3,$G(XMFLAG),XMBODY)
|
---|
135 | Q
|
---|
136 | CHEKBODY(XMZ,XMSTRIP,XMI) ; Remove XMSTRIP, control characters from text
|
---|
137 | N XMLINE,I,XMLEN,XMALTRD
|
---|
138 | S XMI=+$G(XMI)
|
---|
139 | F S XMI=$O(^XMB(3.9,XMZ,2,XMI)) Q:'XMI S XMLINE=^(XMI,0) D
|
---|
140 | . S XMALTRD=0
|
---|
141 | . I $G(XMSTRIP)'="" S XMLEN=$L(XMLINE),XMLINE=$TR(XMLINE,XMSTRIP) I XMLEN>$L(XMLINE) S XMALTRD=1
|
---|
142 | . I XMLINE?.E1C.E D
|
---|
143 | . . S (I,XMALTRD)=1
|
---|
144 | . . F D Q:XMLINE'?.E1C.E
|
---|
145 | . . . I $E(XMLINE,I)?1C S XMLINE=$E(XMLINE,1,I-1)_$E(XMLINE,I+1,999) Q
|
---|
146 | . . . S I=I+1
|
---|
147 | . S:XMALTRD ^XMB(3.9,XMZ,2,XMI,0)=XMLINE
|
---|
148 | Q
|
---|
149 | MOVEPART(XMDUZ,XMZ,XMINSTR) ; Put various parts of the msg in place
|
---|
150 | N XMFDA,XMIENS
|
---|
151 | S XMIENS=XMZ_","
|
---|
152 | I $D(XMINSTR("FROM")) S XMFDA(3.9,XMIENS,1)=XMINSTR("FROM")
|
---|
153 | E D
|
---|
154 | . S XMFDA(3.9,XMIENS,1)=XMDUZ
|
---|
155 | . S:XMDUZ'=DUZ XMFDA(3.9,XMIENS,1.1)=DUZ
|
---|
156 | S XMFDA(3.9,XMIENS,1.4)=$$NOW^XLFDT()
|
---|
157 | I $D(XMINSTR) D
|
---|
158 | . S:$G(XMINSTR("FLAGS"))["R" XMFDA(3.9,XMIENS,1.3)="y"
|
---|
159 | . S:$D(XMINSTR("VAPOR")) XMFDA(3.9,XMIENS,1.6)=XMINSTR("VAPOR")
|
---|
160 | . S:$D(XMINSTR("TYPE")) XMFDA(3.9,XMIENS,1.7)=XMINSTR("TYPE")
|
---|
161 | . I $D(XMINSTR("SCR KEY")) D
|
---|
162 | . . N XMKEY,XMSECURE ; XMSECURE is new'd for scramble
|
---|
163 | . . S XMFDA(3.9,XMIENS,1.8)=$S($G(XMINSTR("SCR HINT"))="":" ",1:XMINSTR("SCR HINT"))
|
---|
164 | . . D LOADCODE^XMJMCODE
|
---|
165 | . . S XMKEY=XMINSTR("SCR KEY")
|
---|
166 | . . D ADJUST^XMJMCODE(.XMKEY)
|
---|
167 | . . S XMFDA(3.9,XMIENS,1.85)="1"_$$ENCSTR^XMJMCODE(XMKEY)
|
---|
168 | . . D ENCMSG^XMJMCODE(XMZ)
|
---|
169 | . S:$G(XMINSTR("FLAGS"))["X" XMFDA(3.9,XMIENS,1.95)="y"
|
---|
170 | . S:$G(XMINSTR("FLAGS"))["C" XMFDA(3.9,XMIENS,1.96)="y"
|
---|
171 | . S:$G(XMINSTR("FLAGS"))["I" XMFDA(3.9,XMIENS,1.97)="y"
|
---|
172 | . S:$G(XMINSTR("FLAGS"))["P" XMFDA(3.9,XMIENS,1.7)=$G(XMFDA(3.9,XMIENS,1.7))_"P"
|
---|
173 | . S:$D(XMINSTR("RCPT BSKT")) XMFDA(3.9,XMIENS,21)=XMINSTR("RCPT BSKT")
|
---|
174 | S:$$BRODCAST^XMKP XMFDA(3.9,XMIENS,1.97)="y"
|
---|
175 | D FILE^DIE("","XMFDA")
|
---|
176 | Q
|
---|
177 | LATER ; TaskMan entry point to send a user's latered message
|
---|
178 | N XMI,XMLATER,XMPREFIX,XMTO,XMV,XMPRIVAT,XMBCAST
|
---|
179 | S XMPRIVAT=$$EZBLD^DIALOG(39135) ; " [Private Mail Group]"
|
---|
180 | S XMBCAST=$$EZBLD^DIALOG(39006) ; "* (Broadcast to all local users)"
|
---|
181 | D INIT^XMVVITAE
|
---|
182 | S XMI=""
|
---|
183 | F S XMI=$O(^TMP("XMY0",$J,XMI)) Q:XMI="" D
|
---|
184 | . S XMPREFIX=$G(^TMP("XMY0",$J,XMI,1)) ; prefix (I:,C:)
|
---|
185 | . S XMLATER=$G(^TMP("XMY0",$J,XMI,"L"))
|
---|
186 | . S:XMLATER'="" XMPREFIX=XMPREFIX_"L@"_XMLATER
|
---|
187 | . S:XMPREFIX'="" XMPREFIX=XMPREFIX_":"
|
---|
188 | . S XMTO(XMPREFIX_$S(XMI[XMPRIVAT:$P(XMI,XMPRIVAT,1),XMI=XMBCAST:"*",1:XMI))="" ; (set in ^XMXADDRG)
|
---|
189 | D SENDMSG(XMDUZ,XMSUBJ,"^TMP(""XM"",$J,""BODY"")",.XMTO,.XMINSTR)
|
---|
190 | S ZTREQ="@"
|
---|
191 | Q
|
---|
192 | PSNDLATR(XMDUZ,XMSUBJ,XMBODY,XMTO,XMINSTR,ZTSK,XMATTACH) ; Set up a task for a program to send a message later
|
---|
193 | N ZTRTN,ZTDTH,ZTDESC,ZTIO,ZTSAVE
|
---|
194 | S ZTIO=""
|
---|
195 | S ZTRTN="PTSKLATR^XMXSEND"
|
---|
196 | S ZTDTH=$$FMTH^XLFDT(XMINSTR("LATER"))
|
---|
197 | S ZTDESC=$$EZBLD^DIALOG(39310) ; MailMan: Send Message Later
|
---|
198 | S ZTSAVE($$OREF^DILF(XMBODY))=""
|
---|
199 | F I="DUZ","XMDUZ","XMSUBJ","XMBODY","XMTO","XMTO(","XMINSTR(","XMATTACH(" S ZTSAVE(I)=""
|
---|
200 | D ^%ZTLOAD
|
---|
201 | ;D HOME^%ZIS call this only if preceded by call to ^%ZIS
|
---|
202 | I '$D(ZTSK) D ERRSET^XMXUTIL(39311) ; Task creation not successful
|
---|
203 | Q
|
---|
204 | PTSKLATR ; TaskMan entry point to send a program's latered message
|
---|
205 | K XMINSTR("LATER")
|
---|
206 | D SENDMSG(XMDUZ,XMSUBJ,XMBODY,.XMTO,.XMINSTR,"",.XMATTACH)
|
---|
207 | S ZTREQ="@"
|
---|
208 | Q
|
---|
209 | STARTMSG(XMSUBJ,XMZ) ;
|
---|
210 | K XMERR,^TMP("XMERR",$J)
|
---|
211 | D CRE8XMZ(XMSUBJ,.XMZ) Q:$D(XMERR)
|
---|
212 | S XMLCNT=0
|
---|
213 | Q
|
---|
214 | BODYLINE(XMZ,XMLINE) ; Put the msg body in place, line by line
|
---|
215 | S XMLCNT=XMLCNT+1
|
---|
216 | S ^XMB(3.9,XMZ,2,XMLCNT,0)=XMLINE
|
---|
217 | Q
|
---|
218 | ENDMSG(XMDUZ,XMZ,XMTO,XMINSTR) ;
|
---|
219 | S ^XMB(3.9,XMZ,2,0)="^^"_XMLCNT_U_XMLCNT_U_DT
|
---|
220 | K XMLCNT
|
---|
221 | D ADDRNSND(XMDUZ,XMZ,.XMTO,.XMINSTR)
|
---|
222 | Q
|
---|
223 | POSTMAST(XMDUZ,XMINSTR) ;
|
---|
224 | S:'$D(XMDUZ) XMDUZ=DUZ
|
---|
225 | D:'$G(XMV("PRIV")) INIT^XMVVITAE
|
---|
226 | S XMINSTR("FROM")=.5
|
---|
227 | Q
|
---|