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