| 1 | XMD ;ISC-SF/GMB-Send/Forward/Add text to a message APIs ;08/27/2003  11:01 | 
|---|
| 2 | ;;8.0;MailMan;**21**;Jun 28, 2002 | 
|---|
| 3 | ; Was (WASH ISC)/THM/CAP | 
|---|
| 4 | ; | 
|---|
| 5 | ; Entry points (DBIA 10070) are: | 
|---|
| 6 | ; ^XMD         Send a message. | 
|---|
| 7 | ;              If no recipients defined, prompt for them. | 
|---|
| 8 | ; EN1^XMD      Put text in a message. | 
|---|
| 9 | ;              If no recipients defined, prompt for them. | 
|---|
| 10 | ;              Send the message. | 
|---|
| 11 | ; ENL^XMD      Add text to an existing message. | 
|---|
| 12 | ; ENT^XMD      Interactive 'send a message'.  (Same as menu) | 
|---|
| 13 | ; ENT1^XMD     Forward a message. | 
|---|
| 14 | ; ENT2^XMD     Forward a message. | 
|---|
| 15 | ;              Prompt for recipients, whether or not any are already | 
|---|
| 16 | ;              defined. | 
|---|
| 17 | ; | 
|---|
| 18 | ; I/O Variables to the various APIs: | 
|---|
| 19 | ; XMDUZ   (in, optional) Sender DUZ or string (default=DUZ) | 
|---|
| 20 | ;              For new messages, XMDUZ may be a string, which will be | 
|---|
| 21 | ;              put in the 'message from' field. | 
|---|
| 22 | ;              For forwarded messages, XMDUZ may be a string, which | 
|---|
| 23 | ;              will be put in the 'forwarded by' field. | 
|---|
| 24 | ; XMSUB   (in) Message subject | 
|---|
| 25 | ; XMTEXT  (in) @location of message.  For example, the following are | 
|---|
| 26 | ;              among the acceptable: | 
|---|
| 27 | ;              XMTEXT="array(" | 
|---|
| 28 | ;              XMTEXT="array(""node""," | 
|---|
| 29 | ;              XMTEXT="^TMP(""namespace"",$J,""array""," | 
|---|
| 30 | ;              The array must be in the acceptable FM word processing | 
|---|
| 31 | ;              format. | 
|---|
| 32 | ; XMSTRIP (in, optional) Characters that user wants stripped from text | 
|---|
| 33 | ;              of message (default=none) | 
|---|
| 34 | ; XMY     (in, optional) Array of recipients, XMY(x)="", where | 
|---|
| 35 | ;               x is a valid local or internet address. | 
|---|
| 36 | ;               XMY(x,0)=basket to deliver to, if x=sender's DUZ or .6 | 
|---|
| 37 | ;               (Basket may be its number or name.  If name, and it | 
|---|
| 38 | ;               doesn't exist, it will be created.) | 
|---|
| 39 | ;               XMY(x,1)=recipient type, either "I" (info only) or | 
|---|
| 40 | ;               "C" (carbon copy) | 
|---|
| 41 | ;               XMY(x,"D")=delete date, if x=.6 ("SHARED,MAIL") | 
|---|
| 42 | ;               A local address may be a user's name or DUZ, a G.group | 
|---|
| 43 | ;               name or S.server name. | 
|---|
| 44 | ;               If not supplied and the process is not queued, | 
|---|
| 45 | ;               you will be prompted. | 
|---|
| 46 | ; XMMG    (in, optional) If XMY is not supplied and the process is not | 
|---|
| 47 | ;               queued, XMMG is used as the default for the first | 
|---|
| 48 | ;               'send to:' prompt.  It is ignored otherwise. | 
|---|
| 49 | ;         (out) Contains error message if error occurs. | 
|---|
| 50 | ;               Undefined if no error. | 
|---|
| 51 | ; DIFROM  (in, optional) ? | 
|---|
| 52 | ; XMROU   (in, optional) Array of routines to be loaded in a PackMan | 
|---|
| 53 | ;               message.   XMROU(x)="", where x=routine name. | 
|---|
| 54 | ; XMYBLOB (in, optional) Array of images from the imaging system to be | 
|---|
| 55 | ;               loaded.  XMYBLOB(y)=x, where y and x are ? | 
|---|
| 56 | ; | 
|---|
| 57 | ; Local Variables: | 
|---|
| 58 | ; XMDF    Flag that programmer interface is in use. | 
|---|
| 59 | ;         Therefore do not check for Security Keys on domains. | 
|---|
| 60 | ; | 
|---|
| 61 | ; Entry point ^XMD | 
|---|
| 62 | ; Needs:   DUZ,XMSUB,XMTEXT | 
|---|
| 63 | ; Accepts: XMDUZ,XMY,XMMG,XMSTRIP,XMROU,DIFROM,XMYBLOB, | 
|---|
| 64 | ;          and, if $D(DIFROM), XMDF | 
|---|
| 65 | ; Ignores: N/A | 
|---|
| 66 | ; Returns: XMZ(if no error),XMMG(if error) | 
|---|
| 67 | ; Kills:   XMSUB,XMTEXT,XMY,XMSTRIP,XMMG(if no error),XMYBLOB | 
|---|
| 68 | N XMV,XMINSTR,XMBLOBER,XMABORT | 
|---|
| 69 | I '$D(DIFROM) N XMDF S XMDF=1 | 
|---|
| 70 | I '$G(DUZ) N DUZ D DUZ^XUP(.5) | 
|---|
| 71 | I $G(XMDUZ)=""!($G(XMDUZ)=0) S XMDUZ=DUZ | 
|---|
| 72 | I XMDUZ'?.N S %=XMDUZ N XMDUZ S XMDUZ=% K % | 
|---|
| 73 | K XMERR,^TMP("XMERR",$J) | 
|---|
| 74 | S XMABORT=0 | 
|---|
| 75 | I '$D(XMTEXT) S XMMG="Error = No message text" Q | 
|---|
| 76 | I '$O(@(XMTEXT_"0)")) S XMMG="Error = No message text" Q | 
|---|
| 77 | I '$D(XMSUB)  S XMMG="Error = No message subject" Q | 
|---|
| 78 | ;I $L(XMSUB)<3!($L(XMSUB)>65) S XMMG="Error = Message subject too long or too short" Q | 
|---|
| 79 | I $L(XMSUB)<3 S XMSUB=XMSUB_"..." | 
|---|
| 80 | I $L(XMSUB)>65 S XMSUB=$E(XMSUB,1,65) | 
|---|
| 81 | I $D(XMY)'<10 K XMMG | 
|---|
| 82 | I XMDUZ'?.N D SETFROM(.XMDUZ,.XMINSTR) Q:$G(XMMG)["Error ="  ; If XMDUZ=.5, becomes POSTMASTER | 
|---|
| 83 | D INITAPI^XMVVITAE | 
|---|
| 84 | D INITLATR^XMXADDR | 
|---|
| 85 | I '$D(XMROU),'$D(DIFROM),'$D(XMYBLOB),$D(XMY) D  Q | 
|---|
| 86 | . D SEND(XMDUZ,XMSUB,XMTEXT,.XMSTRIP,.XMY,.XMINSTR,.XMMG,.XMZ) | 
|---|
| 87 | . D QUIT | 
|---|
| 88 | D CLEANUP^XMXADDR | 
|---|
| 89 | S XMSUB=$$ENCODEUP^XMXUTIL1(XMSUB) | 
|---|
| 90 | F  D CRE8XMZ^XMXSEND(XMSUB,.XMZ) Q:XMZ>0  D | 
|---|
| 91 | . K XMERR,^TMP("XMERR",$J) | 
|---|
| 92 | . I $D(ZTQUEUED) H 1 Q | 
|---|
| 93 | . W !,$C(7),$$EZBLD^DIALOG(34101),! ;Waiting for access to the Message File | 
|---|
| 94 | . N I F I=1:1:10 H 1 W "." | 
|---|
| 95 | I $D(XMYBLOB)>9 D  Q:XMBLOBER | 
|---|
| 96 | . ; Add BLOBS to message | 
|---|
| 97 | . S XMBLOBER=$$MULTI^XMBBLOB(XMZ) | 
|---|
| 98 | . K XMYBLOB | 
|---|
| 99 | . Q:'XMBLOBER | 
|---|
| 100 | . D KILLMSG^XMXUTIL(XMZ) | 
|---|
| 101 | . K XMZ | 
|---|
| 102 | D EN1A | 
|---|
| 103 | Q | 
|---|
| 104 | SEND(XMDUZ,XMSUBJ,XMBODY,XMSTRIP,XMTO,XMINSTR,XMMG,XMZ) ; | 
|---|
| 105 | S XMBODY=$$CREF^DILF(XMBODY) | 
|---|
| 106 | S:$D(XMSTRIP) XMINSTR("STRIP")=XMSTRIP | 
|---|
| 107 | D CHKBSKT(.XMTO,.XMINSTR) | 
|---|
| 108 | D SENDMSG^XMXPARM(.XMDUZ,.XMSUBJ,.XMBODY,.XMTO,.XMINSTR) | 
|---|
| 109 | I $D(XMERR) D ERR1 Q | 
|---|
| 110 | S:$D(XMDF) XMINSTR("ADDR FLAGS")="R" ; Ignore addressee restrictions | 
|---|
| 111 | D SENDMSG^XMXSEND(XMDUZ,XMSUBJ,XMBODY,.XMTO,.XMINSTR,.XMZ) | 
|---|
| 112 | D:$D(XMERR) ERR1 | 
|---|
| 113 | Q | 
|---|
| 114 | ERR1 ; | 
|---|
| 115 | S XMMG="Error = "_^TMP("XMERR",$J,1,"TEXT",1) | 
|---|
| 116 | K XMERR,^TMP("XMERR",$J) | 
|---|
| 117 | Q | 
|---|
| 118 | EN1 ; Enter text in the msg, ask for recipients if there aren't any, | 
|---|
| 119 | ; and send the msg. | 
|---|
| 120 | ; Needs:   DUZ,XMZ,XMTEXT | 
|---|
| 121 | ; Accepts: XMDF,XMY,XMMG,XMSTRIP,XMROU,DIFROM | 
|---|
| 122 | ; Ignores: XMDUZ,XMSUB | 
|---|
| 123 | ; Returns: N/A | 
|---|
| 124 | ; Kills:   XMTEXT,XMY,XMSTRIP,XMMG | 
|---|
| 125 | N XMV,XMABORT,XMDUZ,XMFROM,XMINSTR,XMSUB ; (XMSUB is newed so it isn't killed in QUIT) | 
|---|
| 126 | S XMABORT=0 | 
|---|
| 127 | S XMDUZ=DUZ | 
|---|
| 128 | D INITAPI^XMVVITAE | 
|---|
| 129 | D INITLATR^XMXADDR | 
|---|
| 130 | K XMERR,^TMP("XMERR",$J) | 
|---|
| 131 | I $D(XMY)'<10 K XMMG | 
|---|
| 132 | S XMFROM=$P($G(^XMB(3.9,XMZ,0)),U,2) | 
|---|
| 133 | I XMFROM'="",XMFROM'=XMDUZ S XMINSTR("FROM")=XMFROM | 
|---|
| 134 | D EN1A | 
|---|
| 135 | Q | 
|---|
| 136 | EN1A ; | 
|---|
| 137 | D EN2A | 
|---|
| 138 | Q:$D(DIFROM) | 
|---|
| 139 | D EN3A | 
|---|
| 140 | D QUIT | 
|---|
| 141 | Q | 
|---|
| 142 | EN2A ; | 
|---|
| 143 | N XMI,XMBODY | 
|---|
| 144 | S XMI=0 | 
|---|
| 145 | I $D(XMROU)>9,'$O(^XMB(3.9,XMZ,2,0)) D NEW^XMP S XMI=1,^XMB(3.9,XMZ,2,0)="^^1^1" | 
|---|
| 146 | S XMBODY=$$CREF^DILF(XMTEXT) | 
|---|
| 147 | D MOVEBODY^XMXSEND(XMZ,XMBODY,"A") | 
|---|
| 148 | D CHEKBODY^XMXSEND(XMZ,.XMSTRIP,XMI) | 
|---|
| 149 | S XCNP=+$P($G(^XMB(3.9,XMZ,2,0)),U,3) | 
|---|
| 150 | Q:$D(DIFROM) | 
|---|
| 151 | Q:$D(XMROU)'>9 | 
|---|
| 152 | D XMROU^XMPH | 
|---|
| 153 | K XMROU | 
|---|
| 154 | D PSECURE^XMPSEC(XMZ,.XMABORT) | 
|---|
| 155 | Q | 
|---|
| 156 | EN3 ; called from XPDTP (KIDS) | 
|---|
| 157 | ; XMDUZ must be valid DUZ, if provided.  It may not be a string. | 
|---|
| 158 | N XMV,XMINSTR | 
|---|
| 159 | I '$G(DUZ) N DUZ D DUZ^XUP(.5) | 
|---|
| 160 | I '$D(XMDUZ) S XMDUZ=DUZ | 
|---|
| 161 | D INITAPI^XMVVITAE | 
|---|
| 162 | D INITLATR^XMXADDR | 
|---|
| 163 | D EN3A | 
|---|
| 164 | D QUIT | 
|---|
| 165 | Q | 
|---|
| 166 | EN3A ; | 
|---|
| 167 | N XMABORT | 
|---|
| 168 | S XMABORT=0 | 
|---|
| 169 | S:$D(XMDF) XMINSTR("ADDR FLAGS")="R" ; Ignore addressee restrictions | 
|---|
| 170 | I $D(XMY)<10,'$$GOTADDR^XMXADDR,'$D(ZTQUEUED) D | 
|---|
| 171 | . I $D(XMMG) S XMINSTR("TO PROMPT")=XMMG K XMMG | 
|---|
| 172 | . D TOWHOM^XMJMT($G(XMDUZ,DUZ),$$EZBLD^DIALOG(34110),.XMINSTR,"",.XMABORT) ;Send | 
|---|
| 173 | E  D | 
|---|
| 174 | . D CHKBSKT(.XMY,.XMINSTR) | 
|---|
| 175 | . D CHKADDR^XMXADDR(XMDUZ,.XMY,.XMINSTR) K:$D(XMERR) XMERR,^TMP("XMERR",$J) | 
|---|
| 176 | Q:XMABORT | 
|---|
| 177 | I '$$GOTADDR^XMXADDR S:'$D(XMMG) XMMG="Error = No recipients." Q | 
|---|
| 178 | D BLDNSND^XMXSEND(XMDUZ,XMZ,.XMINSTR) | 
|---|
| 179 | Q | 
|---|
| 180 | QUIT ; | 
|---|
| 181 | K XMSUB,XMTEXT,XMY,XMSTRIP | 
|---|
| 182 | D CLEANUP^XMXADDR | 
|---|
| 183 | Q | 
|---|
| 184 | ENT ; Entry for outside users | 
|---|
| 185 | ; All input variables ignored | 
|---|
| 186 | I '$G(DUZ) W "  User ID needed (DUZ) !!" Q | 
|---|
| 187 | D EN^XM,SEND^XMJMS | 
|---|
| 188 | Q | 
|---|
| 189 | INIT ; From DIFROM | 
|---|
| 190 | D XMZ^XMA2 Q:XMZ<1  S $P(^XMB(3.9,XMZ,0),U,7)="X" D NEW^XMP | 
|---|
| 191 | Q | 
|---|
| 192 | ENT1 ; Forward a msg, do not ask for recipients | 
|---|
| 193 | ; Needs:   DUZ,XMZ,XMY | 
|---|
| 194 | ; Accepts: XMDUZ | 
|---|
| 195 | ; Ignores: XMSUB,XMTEXT,XMMG,XMSTRIP,XMROU,DIFROM,XMYBLOB | 
|---|
| 196 | ; Returns: N/A | 
|---|
| 197 | ; Kills:   XMDUZ,XMY | 
|---|
| 198 | N XMDF | 
|---|
| 199 | S XMDF=1 | 
|---|
| 200 | D ENT1A(0) | 
|---|
| 201 | Q | 
|---|
| 202 | ENT1A(XMASK) ; | 
|---|
| 203 | N XMV,XMINSTR,XMABORT | 
|---|
| 204 | K XMERR,^TMP("XMERR",$J) | 
|---|
| 205 | I '$G(DUZ) N DUZ D DUZ^XUP(.5) | 
|---|
| 206 | I $G(XMDUZ)=""!($G(XMDUZ)=0) S XMDUZ=DUZ | 
|---|
| 207 | S XMABORT=0 | 
|---|
| 208 | D:XMDUZ'?.N SETFWD(.XMDUZ,.XMINSTR) | 
|---|
| 209 | D INITAPI^XMVVITAE | 
|---|
| 210 | D INIT^XMXADDR | 
|---|
| 211 | S:$D(XMDF) XMINSTR("ADDR FLAGS")="R" ; Ignore addressee restrictions | 
|---|
| 212 | I XMASK D TOWHOM^XMJMT(XMDUZ,$$EZBLD^DIALOG(34111),.XMINSTR,"",.XMABORT) Q:XMABORT  ;Forward | 
|---|
| 213 | D CHKBSKT(.XMY,.XMINSTR) | 
|---|
| 214 | D CHKADDR^XMXADDR(XMDUZ,.XMY,.XMINSTR) K:$D(XMERR) XMERR,^TMP("XMERR",$J) | 
|---|
| 215 | I $$GOTADDR^XMXADDR D | 
|---|
| 216 | . D FWD^XMKP(XMDUZ,XMZ,.XMINSTR) | 
|---|
| 217 | . D CHECK^XMKPL | 
|---|
| 218 | E  S:'$D(XMMG) XMMG="Error = No recipients." | 
|---|
| 219 | K XMDUZ,XMY | 
|---|
| 220 | D CLEANUP^XMXADDR | 
|---|
| 221 | Q | 
|---|
| 222 | ENT2 ; Forward a msg, ask for (more) recipients | 
|---|
| 223 | ; Needs:   DUZ,XMZ | 
|---|
| 224 | ; Accepts: XMDUZ,XMY,XMDF | 
|---|
| 225 | ; Ignores: XMSUB,XMTEXT,XMMG,XMSTRIP,XMROU,DIFROM,XMYBLOB | 
|---|
| 226 | ; Returns: N/A | 
|---|
| 227 | ; Kills:   XMDUZ,XMY | 
|---|
| 228 | D ENT1A($S($D(ZTQUEUED):0,1:1)) | 
|---|
| 229 | Q | 
|---|
| 230 | ENX ;FROM MAILMAN | 
|---|
| 231 | S %=XMDUZ N XMDUZ,XMK S XMDUZ=% D XMD K % | 
|---|
| 232 | Q | 
|---|
| 233 | ENL ; Add text to an existing message | 
|---|
| 234 | ; Needs:   XMZ,XMTEXT | 
|---|
| 235 | ; Accepts: XMSTRIP | 
|---|
| 236 | ; Ignores: DUZ,XMDUZ,XMSUB,XMMG,XMY,XMROU,DIFROM,XMYBLOB | 
|---|
| 237 | ; Returns: N/A | 
|---|
| 238 | ; Kills:   XMSTRIP | 
|---|
| 239 | N XMI,XMBODY | 
|---|
| 240 | K XMERR,^TMP("XMERR",$J) | 
|---|
| 241 | S XMBODY=$$CREF^DILF(XMTEXT) | 
|---|
| 242 | S XMI=+$P($G(^XMB(3.9,XMZ,2,0)),U,3) | 
|---|
| 243 | D MOVEBODY^XMXSEND(XMZ,XMBODY,"A") | 
|---|
| 244 | D CHEKBODY^XMXSEND(XMZ,.XMSTRIP,XMI) | 
|---|
| 245 | K XMSTRIP | 
|---|
| 246 | Q | 
|---|
| 247 | CHKBSKT(XMTO,XMINSTR) ; | 
|---|
| 248 | I $D(XMTO(XMDUZ,0)) S XMINSTR("SELF BSKT")=XMTO(XMDUZ,0) | 
|---|
| 249 | I $D(XMTO(.6,0)) S XMINSTR("SHARE BSKT")=XMTO(.6,0) | 
|---|
| 250 | I $D(XMTO(.6,"D")) S XMINSTR("SHARE DATE")=XMTO(.6,"D") | 
|---|
| 251 | N XMADDR | 
|---|
| 252 | S XMADDR="" | 
|---|
| 253 | F  S XMADDR=$O(XMTO(XMADDR)) Q:XMADDR=""  I $D(XMTO(XMADDR,1)) D | 
|---|
| 254 | . S XMTO(XMTO(XMADDR,1)_":"_XMADDR)="" | 
|---|
| 255 | . K XMTO(XMADDR) | 
|---|
| 256 | Q | 
|---|
| 257 | SETFROM(XMDUZ,XMINSTR) ; | 
|---|
| 258 | Q:XMDUZ=DUZ | 
|---|
| 259 | N XMPOSTPR | 
|---|
| 260 | I XMDUZ=.5 D  Q:XMPOSTPR | 
|---|
| 261 | . S XMPOSTPR=+$O(^XMB(3.7,"AB",DUZ,.5,0)) | 
|---|
| 262 | . Q:'XMPOSTPR | 
|---|
| 263 | . I $P($G(^XMB(3.7,.5,9,XMPOSTPR,0)),U,3)'="y" S XMPOSTPR=0 | 
|---|
| 264 | I XMDUZ'="POSTMASTER",XMDUZ'=.5 D CHKUSER(.XMDUZ) Q:+XMDUZ=XMDUZ | 
|---|
| 265 | S XMINSTR("FROM")=$$XMFROM^XMXPARM("XMDUZ",XMDUZ) | 
|---|
| 266 | I $D(XMERR) D ERR1 Q | 
|---|
| 267 | S XMDUZ=DUZ | 
|---|
| 268 | Q | 
|---|
| 269 | SETFWD(XMDUZ,XMINSTR) ; | 
|---|
| 270 | Q:XMDUZ=DUZ | 
|---|
| 271 | I XMDUZ=.5,$D(^XMB(3.7,"AB",DUZ,.5)) Q | 
|---|
| 272 | I XMDUZ=.5,'$D(^XMB(3.7,"AB",DUZ,.5)) S XMDUZ="POSTMASTER" | 
|---|
| 273 | E  D CHKUSER(.XMDUZ) Q:+XMDUZ=XMDUZ | 
|---|
| 274 | S XMINSTR("FWD BY")=$$XMFROM^XMXPARM("XMDUZ",XMDUZ) | 
|---|
| 275 | I $D(XMERR) D ERR1 Q | 
|---|
| 276 | S XMDUZ=DUZ | 
|---|
| 277 | Q | 
|---|
| 278 | CHKUSER(XMDUZ) ; | 
|---|
| 279 | N XMERR | 
|---|
| 280 | D CHKUSER^XMXPARM1(.XMDUZ) | 
|---|
| 281 | I $D(XMERR) K ^TMP("XMERR",$J),DIERR,^TMP("DIERR",$J) | 
|---|
| 282 | Q | 
|---|