| 1 | XMXUTIL ;ISC-SF/GMB-Message & Mailbox Utilities ;06/19/2002  07:39
 | 
|---|
| 2 |  ;;8.0;MailMan;;Jun 28, 2002
 | 
|---|
| 3 |  ; All entry points covered by DBIA 2734.
 | 
|---|
| 4 | WAIT ;
 | 
|---|
| 5 |  N DIR,Y,DIRUT S DIR(0)="E",DIR("A")=$$EZBLD^DIALOG(37003) D ^DIR ; Press RETURN to continue
 | 
|---|
| 6 |  Q
 | 
|---|
| 7 | PAGE(XMABORT) ;
 | 
|---|
| 8 |  N DIR,Y,DIRUT S DIR(0)="E" D ^DIR I $D(DIRUT) S XMABORT=1
 | 
|---|
| 9 |  Q
 | 
|---|
| 10 | NEWS(XMDUZ,XMTEST) ;
 | 
|---|
| 11 |  ; Given:
 | 
|---|
| 12 |  ;   XMDUZ    User's DUZ
 | 
|---|
| 13 |  ;   XMTEST   0=this is not a test. (DEFAULT)
 | 
|---|
| 14 |  ;            (Field 1.12 LAST NEW MSG NOTIFY DATE/TIME may be updated)
 | 
|---|
| 15 |  ;            1=this is just a test.
 | 
|---|
| 16 |  ;            (Field 1.12 will not be updated)
 | 
|---|
| 17 |  ; Returns:
 | 
|---|
| 18 |  ;   -1       If no record of this user
 | 
|---|
| 19 |  ;   0        If no new mail
 | 
|---|
| 20 |  ; Otherwise, if the user has new mail, returns an ^-delimited string:
 | 
|---|
| 21 |  ;   Piece 1:  # New Msgs
 | 
|---|
| 22 |  ;   Piece 2:  Does the user have new priority mail? (1=yes;0=no)
 | 
|---|
| 23 |  ;   Piece 3:  # New Msgs in IN basket
 | 
|---|
| 24 |  ;   Piece 4:  Date/Time (FileMan) that the last msg was received
 | 
|---|
| 25 |  ;   Piece 5:  Have there been any new messages since the last time
 | 
|---|
| 26 |  ;             this function was called? (1=yes;0=no)
 | 
|---|
| 27 |  ; And for the first priority read basket with new messages in it:
 | 
|---|
| 28 |  ; (If none has new messages, then first priority read basket)
 | 
|---|
| 29 |  ;   Piece 6:  # New Msgs in basket
 | 
|---|
| 30 |  ;   Piece 7:  Basket IEN
 | 
|---|
| 31 |  ;   Piece 8:  Basket name
 | 
|---|
| 32 |  N XMREC,XMNEW,XMRECEIV,XMNOTIFY
 | 
|---|
| 33 |  S XMREC=$G(^XMB(3.7,XMDUZ,0))
 | 
|---|
| 34 |  Q:XMREC="" -1
 | 
|---|
| 35 |  S XMNEW=+$P(XMREC,U,6)
 | 
|---|
| 36 |  Q:'XMNEW 0
 | 
|---|
| 37 |  S XMRECEIV=$P(XMREC,U,14) ; date/time last msg received
 | 
|---|
| 38 |  S XMNOTIFY=$P(XMREC,U,15) ; date/time user last notified
 | 
|---|
| 39 |  I XMRECEIV>XMNOTIFY,'$G(XMTEST) S $P(^XMB(3.7,XMDUZ,0),U,15)=XMRECEIV
 | 
|---|
| 40 |  Q XMNEW_U_($D(^XMB(3.7,XMDUZ,"N"))>0)_U_+$P(^XMB(3.7,XMDUZ,2,1,0),U,2)_U_XMRECEIV_U_(XMRECEIV>XMNOTIFY)_U_$$NPBSKT^XMJBN(XMDUZ)
 | 
|---|
| 41 | TNMSGCT(XMDUZ) ; Total new msg count
 | 
|---|
| 42 |  Q +$P(^XMB(3.7,XMDUZ,0),U,6)
 | 
|---|
| 43 | BNMSGCT(XMDUZ,XMK) ; Basket new msg count
 | 
|---|
| 44 |  Q +$P(^XMB(3.7,XMDUZ,2,XMK,0),U,2)
 | 
|---|
| 45 | TPMSGCT(XMDUZ) ; Total new priority msg count
 | 
|---|
| 46 |  I '$D(^XMB(3.7,XMDUZ,"N")) Q 0
 | 
|---|
| 47 |  N XMK,I,XMZ
 | 
|---|
| 48 |  S (XMK,I,XMZ)=0
 | 
|---|
| 49 |  F  S XMK=$O(^XMB(3.7,XMDUZ,"N",XMK)) Q:'XMK  D
 | 
|---|
| 50 |  . F I=I:1 S XMZ=$O(^XMB(3.7,XMDUZ,"N",XMK,XMZ)) Q:'XMZ
 | 
|---|
| 51 |  Q I
 | 
|---|
| 52 | BPMSGCT(XMDUZ,XMK) ; Basket new priority msg count
 | 
|---|
| 53 |  I '$D(^XMB(3.7,XMDUZ,"N",XMK)) Q 0
 | 
|---|
| 54 |  N I,XMZ
 | 
|---|
| 55 |  S XMZ=0
 | 
|---|
| 56 |  F I=0:1 S XMZ=$O(^XMB(3.7,XMDUZ,"N",XMK,XMZ)) Q:'XMZ
 | 
|---|
| 57 |  Q I
 | 
|---|
| 58 | TMSGCT(XMDUZ) ; Total msg count
 | 
|---|
| 59 |  N I,XMK
 | 
|---|
| 60 |  S I=0,XMK=.99
 | 
|---|
| 61 |  F  S XMK=$O(^XMB(3.7,XMDUZ,2,XMK)) Q:XMK'>0  S I=I+$$BMSGCT(XMDUZ,XMK)
 | 
|---|
| 62 |  Q I
 | 
|---|
| 63 | BMSGCT(XMDUZ,XMK) ; Basket msg count
 | 
|---|
| 64 |  Q +$P($G(^XMB(3.7,XMDUZ,2,XMK,1,0)),U,4)
 | 
|---|
| 65 | KVAPOR(XMDUZ,XMK,XMZ,XMVAPOR,XMIU) ; Set/delete a message's vaporize date in user's basket
 | 
|---|
| 66 |  ; XMVAPOR ="@"           delete it
 | 
|---|
| 67 |  ;         =FM date/time  set/change it
 | 
|---|
| 68 |  N XMFDA,XMIENS
 | 
|---|
| 69 |  S XMIENS=XMZ_","_XMK_","_XMDUZ_","
 | 
|---|
| 70 |  S XMFDA(3.702,XMIENS,5)=XMVAPOR
 | 
|---|
| 71 |  I XMVAPOR="@" D
 | 
|---|
| 72 |  . K XMIU("KVAPOR")
 | 
|---|
| 73 |  . S XMFDA(3.702,XMIENS,7)="@"
 | 
|---|
| 74 |  E  D
 | 
|---|
| 75 |  . S XMIU("KVAPOR")=XMVAPOR
 | 
|---|
| 76 |  . S XMFDA(3.702,XMIENS,7)=0
 | 
|---|
| 77 |  D FILE^DIE("","XMFDA")
 | 
|---|
| 78 |  Q
 | 
|---|
| 79 | BSKTNAME(XMDUZ,XMK) ; What's the name of this basket for this user?
 | 
|---|
| 80 |  Q $P($G(^XMB(3.7,XMDUZ,2,XMK,0)),U,1)
 | 
|---|
| 81 | NAME(XMID,XMIT) ; Given a name or DUZ, return the name
 | 
|---|
| 82 |  ; XMID user's DUZ or name
 | 
|---|
| 83 |  ; XMIT 1=if DUZ, return institution and title, too, if needed
 | 
|---|
| 84 |  ;      0=just return the name (default)
 | 
|---|
| 85 |  Q:+XMID'=XMID $S(XMID'="":XMID,1:$$EZBLD^DIALOG(34009)) ; * No Name *
 | 
|---|
| 86 |  N XMNAME,XMTITLE,XMINST
 | 
|---|
| 87 |  I '$D(^VA(200,XMID,0)) Q $$EZBLD^DIALOG(34010,XMID) ; * User #|1| * (not in NEW PERSON file)
 | 
|---|
| 88 |  S XMNAME("FILE")=200,XMNAME("IENS")=XMID_",",XMNAME("FIELD")=.01
 | 
|---|
| 89 |  S XMNAME=$$NAMEFMT^XLFNAME(.XMNAME,"F","C")
 | 
|---|
| 90 |  Q:'$G(XMIT) XMNAME
 | 
|---|
| 91 |  I XMV("SHOW TITL") D
 | 
|---|
| 92 |  . I XMV("TITL SRC")="S" S XMTITLE=$P($G(^VA(200,XMID,20)),U,3) ; field 20.3, SIGNATURE BLOCK TITLE
 | 
|---|
| 93 |  . I $G(XMTITLE)="",$P(^VA(200,XMID,0),U,9) S XMTITLE=$P($G(^DIC(3.1,$P(^(0),U,9),0)),U) ; field 8, TITLE
 | 
|---|
| 94 |  . S:$G(XMTITLE)'="" XMNAME=XMNAME_" - "_XMTITLE
 | 
|---|
| 95 |  I XMV("SHOW INST"),$D(^XMB(3.7,XMID,6000)) D
 | 
|---|
| 96 |  . S XMINST=$P(^XMB(3.7,XMID,6000),U)
 | 
|---|
| 97 |  . S:XMINST'="" XMNAME=XMNAME_" ("_XMINST_")"
 | 
|---|
| 98 |  Q XMNAME
 | 
|---|
| 99 | NETNAME(XMDUZ) ; Given a DUZ or a string, return an internet name @ site name.
 | 
|---|
| 100 |  N XMNETNAM
 | 
|---|
| 101 |  Q:XMDUZ["@" XMDUZ
 | 
|---|
| 102 |  I +XMDUZ=XMDUZ!(XMDUZ="") D
 | 
|---|
| 103 |  . S:'XMDUZ XMDUZ=.5
 | 
|---|
| 104 |  . ; Use Mail Name.  Lacking that, use real name.
 | 
|---|
| 105 |  . S XMNETNAM=$S($L($P($G(^XMB(3.7,XMDUZ,.3)),U)):$P(^(.3),U),1:$$NAME(XMDUZ))
 | 
|---|
| 106 |  . I $E(XMNETNAM)=$C(34),$E(XMNETNAM,$L(XMNETNAM))=$C(34) Q  ; Ignore if quoted
 | 
|---|
| 107 |  . I XMNETNAM?.E1C.E!($TR(XMNETNAM,$C(34)_"<>()[];:")'=XMNETNAM) S XMNETNAM=$C(34)_XMNETNAM_$C(34) Q  ; Quote if illegal
 | 
|---|
| 108 |  . I XMNETNAM[","!(XMNETNAM[" ") S XMNETNAM=$TR(XMNETNAM,", .","._+")  ; Translate
 | 
|---|
| 109 |  E  D
 | 
|---|
| 110 |  . S XMNETNAM=XMDUZ
 | 
|---|
| 111 |  . I $E(XMNETNAM)'=$C(34),$E(XMNETNAM,$L(XMNETNAM))'=$C(34) D
 | 
|---|
| 112 |  . . I $E(XMNETNAM)="<",$E(XMNETNAM,$L(XMNETNAM))=">" D  I $E(XMNETNAM)=$C(34),$E(XMNETNAM,$L(XMNETNAM))=$C(34) Q
 | 
|---|
| 113 |  . . . S XMNETNAM=$E(XMNETNAM,2,$L(XMNETNAM)-1)
 | 
|---|
| 114 |  . . I XMNETNAM?.E1C.E!($TR(XMNETNAM,$C(34)_" ,<>()[];:")'=XMNETNAM) S XMNETNAM=$C(34)_XMNETNAM_$C(34) ; Quote if illegal
 | 
|---|
| 115 |  Q XMNETNAM_"@"_^XMB("NETNAME")
 | 
|---|
| 116 | LOCK(XMDOOR,XMLOCKED,XMWAIT) ; Lock a global (** NOT USED **)
 | 
|---|
| 117 |  L +@XMDOOR:$G(XMWAIT,0) E  S XMLOCKED=0 Q
 | 
|---|
| 118 |  S XMLOCKED=1
 | 
|---|
| 119 |  Q
 | 
|---|
| 120 | MAKENEW(XMDUZ,XMK,XMZ,XMLOCKIT) ; Make a message new
 | 
|---|
| 121 |  ; Should lock before calling AND unlock after.
 | 
|---|
| 122 |  ; If you set XMLOCKIT=1, I'll do the locking for you.
 | 
|---|
| 123 |  Q:$D(^XMB(3.7,XMDUZ,"N0",XMK,XMZ))
 | 
|---|
| 124 |  Q:'$D(^XMB(3.7,XMDUZ,2,XMK,1,XMZ))
 | 
|---|
| 125 |  N XMFDA
 | 
|---|
| 126 |  S XMFDA(3.702,XMZ_","_XMK_","_XMDUZ_",",3)="1" ; new
 | 
|---|
| 127 |  I $G(XMLOCKIT) L +^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0):1
 | 
|---|
| 128 |  D FILE^DIE("","XMFDA")
 | 
|---|
| 129 |  I $G(XMLOCKIT) L -^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0)
 | 
|---|
| 130 |  D INCRNEW(XMDUZ,XMK)
 | 
|---|
| 131 |  Q
 | 
|---|
| 132 | INCRNEW(XMDUZ,XMK,XMCNT) ; Increment the number of new messages in a basket
 | 
|---|
| 133 |  ; For internal use only!
 | 
|---|
| 134 |  S:'$D(XMCNT) XMCNT=1
 | 
|---|
| 135 |  L +^XMB(3.7,XMDUZ,0):1
 | 
|---|
| 136 |  S $P(^(0),U,2)=$P(^XMB(3.7,XMDUZ,2,XMK,0),U,2)+XMCNT ; New msgs in bskt
 | 
|---|
| 137 |  S $P(^(0),U,6)=$P(^XMB(3.7,XMDUZ,0),U,6)+XMCNT ; New msgs for user
 | 
|---|
| 138 |  S $P(^XMB(3.7,XMDUZ,0),U,14)=$$NOW^XLFDT ; When last msg rec'd
 | 
|---|
| 139 |  L -^XMB(3.7,XMDUZ,0)
 | 
|---|
| 140 |  Q
 | 
|---|
| 141 | NONEW(XMDUZ,XMK,XMZ,XMLOCKIT) ; Make a message not new
 | 
|---|
| 142 |  ; Should lock before calling AND unlock after.
 | 
|---|
| 143 |  ; If you set XMLOCKIT=1, I'll do the locking for you.
 | 
|---|
| 144 |  Q:'$D(^XMB(3.7,XMDUZ,"N0",XMK,XMZ))
 | 
|---|
| 145 |  N XMFDA
 | 
|---|
| 146 |  S XMFDA(3.702,XMZ_","_XMK_","_XMDUZ_",",3)="@" ; no longer new
 | 
|---|
| 147 |  I $G(XMLOCKIT) L +^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0):1
 | 
|---|
| 148 |  D FILE^DIE("","XMFDA")
 | 
|---|
| 149 |  I $G(XMLOCKIT) L -^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0)
 | 
|---|
| 150 |  D DECRNEW(XMDUZ,XMK)
 | 
|---|
| 151 |  Q
 | 
|---|
| 152 | DECRNEW(XMDUZ,XMK,XMCNT) ; Decrement the number of new messages in a basket
 | 
|---|
| 153 |  ; For internal use only!
 | 
|---|
| 154 |  S:'$D(XMCNT) XMCNT=1
 | 
|---|
| 155 |  L +^XMB(3.7,XMDUZ,0):1
 | 
|---|
| 156 |  I $P(^XMB(3.7,XMDUZ,2,XMK,0),U,2) S $P(^(0),U,2)=$P(^(0),U,2)-XMCNT ; New msgs in bskt
 | 
|---|
| 157 |  I $P(^XMB(3.7,XMDUZ,0),U,6) S $P(^(0),U,6)=$P(^(0),U,6)-XMCNT ; New msgs for user
 | 
|---|
| 158 |  L -^XMB(3.7,XMDUZ,0)
 | 
|---|
| 159 |  Q
 | 
|---|
| 160 | KILLMSG(DA) ; For internal MM use only.  Kill a msg in ^XMB(3.9
 | 
|---|
| 161 |  N DIK
 | 
|---|
| 162 |  S DIK="^XMB(3.9,"
 | 
|---|
| 163 |  L +^XMB(3.9,0):1
 | 
|---|
| 164 |  D ^DIK
 | 
|---|
| 165 |  L -^XMB(3.9,0)
 | 
|---|
| 166 |  Q
 | 
|---|
| 167 | LASTACC(XMDUZ,XMK,XMZ,XMRESP,XMIM,XMINSTR,XMIU,XMCONFRM) ; Note first, last accesses, number of responses read
 | 
|---|
| 168 |  ; in:
 | 
|---|
| 169 |  ; XMDUZ,XMK,XMZ the usual.  If message not in basket, set XMK=0.
 | 
|---|
| 170 |  ; XMRESP   last response read this time
 | 
|---|
| 171 |  ; XMIM     "SUBJ", "FROM"
 | 
|---|
| 172 |  ; XMINSTR  "FLAGS"
 | 
|---|
| 173 |  ; XMIU     "IEN", "RESP"
 | 
|---|
| 174 |  ; out:
 | 
|---|
| 175 |  ; XMCONFRM Confirmation message was sent to message sender (0=no; 1=yes)
 | 
|---|
| 176 |  N XMNOW,XMREC,XMFDA,XMIENS
 | 
|---|
| 177 |  I XMRESP D
 | 
|---|
| 178 |  . N XMRESPS ; User can't read more responses than there are.
 | 
|---|
| 179 |  . S XMRESPS=+$P($G(^XMB(3.9,XMZ,3,0)),U,4)
 | 
|---|
| 180 |  . I XMRESP>XMRESPS S XMRESP=XMRESPS
 | 
|---|
| 181 |  S XMCONFRM=0
 | 
|---|
| 182 |  I 'XMIU("IEN") D  Q
 | 
|---|
| 183 |  . I XMRESP>XMIU("RESP")!(XMIU("RESP")="") S XMIU("RESP")=XMRESP
 | 
|---|
| 184 |  S XMNOW=$$NOW^XLFDT
 | 
|---|
| 185 |  S XMREC=^XMB(3.9,XMZ,1,XMIU("IEN"),0)
 | 
|---|
| 186 |  I $P(XMREC,U,10)="" D
 | 
|---|
| 187 |  . S $P(XMREC,U,10)=XMNOW ; first access 
 | 
|---|
| 188 |  . ; If confirmation requested, and user is not sender, send confirmation
 | 
|---|
| 189 |  . I XMINSTR("FLAGS")["R",XMDUZ'=XMIM("FROM") D CONFIRM^XMXUTIL1(XMDUZ,XMZ,.XMIM) S XMCONFRM=1
 | 
|---|
| 190 |  S $P(XMREC,U,3)=XMNOW  ; last access
 | 
|---|
| 191 |  I $S(XMRESP>$P(XMREC,U,2):1,1:$P(XMREC,U,2)="") S XMIU("RESP")=XMRESP,$P(XMREC,U,2)=XMRESP ; last response read
 | 
|---|
| 192 |  S ^XMB(3.9,XMZ,1,XMIU("IEN"),0)=XMREC
 | 
|---|
| 193 |  I XMDUZ'=DUZ,XMDUZ'=.6 S ^XMB(3.9,XMZ,1,XMIU("IEN"),"S")=XMV("DUZ NAME")
 | 
|---|
| 194 |  Q:'XMK
 | 
|---|
| 195 |  S XMREC=$G(^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0))
 | 
|---|
| 196 |  Q:XMREC=""  ; Message is not in the user's basket
 | 
|---|
| 197 |  I '$P(XMREC,U,7) D  Q
 | 
|---|
| 198 |  . S $P(^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0),U,4)=XMNOW ; last access (for MailMan's auto-vaporize)
 | 
|---|
| 199 |  ; MailMan has set an automatic delete date.  Since this message was
 | 
|---|
| 200 |  ; just accessed, we must delete that date.
 | 
|---|
| 201 |  S XMIENS=XMZ_","_XMK_","_XMDUZ_","
 | 
|---|
| 202 |  S XMFDA(3.702,XMIENS,4)=XMNOW ; last access (for MailMan's auto-vaporize)
 | 
|---|
| 203 |  S XMFDA(3.702,XMIENS,5)="@" ; automatic delete date
 | 
|---|
| 204 |  S XMFDA(3.702,XMIENS,7)="@" ; delete date set by MailMan?
 | 
|---|
| 205 |  D FILE^DIE("","XMFDA")
 | 
|---|
| 206 |  Q
 | 
|---|
| 207 | ERRSET(XMID,XMPARM,XMZ) ; For internal MailMan use only.
 | 
|---|
| 208 |  S XMERR=$G(XMERR)+1
 | 
|---|
| 209 |  S ^TMP("XMERR",$J,XMERR)=XMID
 | 
|---|
| 210 |  I $D(XMZ) S ^TMP("XMERR",$J,XMERR,"XMZ")=XMZ
 | 
|---|
| 211 |  I $D(XMPARM("PARAM")) M ^TMP("XMERR",$J,XMERR,"PARAM")=XMPARM("PARAM")
 | 
|---|
| 212 |  D BLD^DIALOG(XMID,.XMPARM,"","^TMP(""XMERR"",$J,"_XMERR_",""TEXT"")")
 | 
|---|
| 213 |  S ^TMP("XMERR",$J,"E",XMID,XMERR)=""
 | 
|---|
| 214 |  Q
 | 
|---|