1 | XMTDL ;ISC-SF/GMB-Deliver local mail to mailbox ;10/23/2002 06:37
|
---|
2 | ;;8.0;MailMan;**1,6**;Jun 28, 2002
|
---|
3 | ; Replaces ^XMAD0,GO^XMADGO,STATS^XMADJF0,^XMADJF1,^XMADJF1A (ISC-WASH/CAP)
|
---|
4 | GO ;
|
---|
5 | ; Variables provided through TASKMAN: XMHANG,XMGROUP,XMQUEUE
|
---|
6 | N XMTSTAMP,XMUID,XMIDLE,X,XMMCNT,XMRCNT,XMACNT
|
---|
7 | ; XMMCNT # of messages/responses processed
|
---|
8 | ; XMRCNT # of potential local recipients to process
|
---|
9 | ; XMACNT # of actual local recipients processed
|
---|
10 | S:$D(ZTQUEUED) ZTREQ="@"
|
---|
11 | Q:$P($G(^XMB(1,1,0)),U,16)
|
---|
12 | I $$NEWERR^%ZTER N $ETRAP,$ESTACK S $ETRAP="D R^XMCTRAP"
|
---|
13 | E S X="R^XMCTRAP",@^%ZOSF("TRAP")
|
---|
14 | I $D(^%ZOSF("TRAP")) S X="^%ET",@^("TRAP")
|
---|
15 | I $D(^%ZOSF("PRIORITY")) S X=$S(+$G(^XMB(1,1,.13)):+^(.13),1:5) X ^%ZOSF("PRIORITY")
|
---|
16 | L +^XMBPOST(XMGROUP,XMQUEUE):0 E H 0 Q
|
---|
17 | S XMIDLE=0
|
---|
18 | F D Q:$P($G(^XMB(1,1,0)),U,16)!($$TSTAMP^XMXUTIL1-XMIDLE>900)
|
---|
19 | . F S XMTSTAMP=$O(^XMBPOST(XMGROUP,XMQUEUE,"")) Q:XMTSTAMP'>0 D
|
---|
20 | . . S XMIDLE=0
|
---|
21 | . . F S XMUID=$O(^XMBPOST(XMGROUP,XMQUEUE,XMTSTAMP,"")) Q:XMUID="" D
|
---|
22 | . . . I XMGROUP="M" D
|
---|
23 | . . . . D MDELIVER(XMGROUP,XMQUEUE,XMTSTAMP,XMUID,.XMMCNT,.XMRCNT,.XMACNT)
|
---|
24 | . . . E D
|
---|
25 | . . . . D RDELIVER(XMGROUP,XMQUEUE,XMTSTAMP,XMUID,.XMMCNT,.XMRCNT,.XMACNT)
|
---|
26 | . . . K ^XMBPOST(XMGROUP,XMQUEUE,XMTSTAMP,XMUID)
|
---|
27 | . . . D:'$D(^XMBPOST("STATS","OFF")) STATS^XMTDL1(XMGROUP,XMQUEUE,XMMCNT,XMRCNT,XMACNT) ; Delivered to # users
|
---|
28 | . L +^XMBPOST("QSTATS",XMGROUP,XMQUEUE):0
|
---|
29 | . S ^XMBPOST(XMGROUP,XMQUEUE)=""
|
---|
30 | . L -^XMBPOST("QSTATS",XMGROUP,XMQUEUE)
|
---|
31 | . S:XMIDLE=0 XMIDLE=$$TSTAMP^XMXUTIL1
|
---|
32 | . H XMHANG
|
---|
33 | L -^XMBPOST(XMGROUP,XMQUEUE)
|
---|
34 | Q
|
---|
35 | RDELIVER(XMGROUP,XMQUEUE,XMTSTAMP,XMZ,XMMCNT,XMRCNT,XMACNT) ; was ^XMADJF1
|
---|
36 | ; Note: We know that XMGROUP="R" here
|
---|
37 | N XMZR,XMREC,XMFROM,XMFLIST,XMFIRST,XMFDA,I,XMZREC,XMZSUBJ,XMZFROM,XMZDATE,XMRESPS,XMTO,XMZRLIST
|
---|
38 | ; XMFIRST sender of the first response processed
|
---|
39 | K ^XMBPOST(XMGROUP,XMQUEUE,"B",XMZ,XMTSTAMP) ; Accept no more additions to this batch of replies
|
---|
40 | ;Post responses to message response multiple, keeping track of number of deliveries
|
---|
41 | S (XMMCNT,XMRCNT,XMACNT)=0
|
---|
42 | I '$D(^XMB(3.9,XMZ,0)) D Q
|
---|
43 | . D BADERR(36240,XMZ) ; Message |1| does not exist. Can't post responses to it.
|
---|
44 | . S XMZR=""
|
---|
45 | . F S XMZR=$O(^XMBPOST(XMGROUP,XMQUEUE,XMTSTAMP,XMZ,XMZR)) Q:XMZR="" S XMRCNT=XMRCNT+^(XMZR),XMMCNT=XMMCNT+1
|
---|
46 | S XMZREC=^XMB(3.9,XMZ,0)
|
---|
47 | S XMZSUBJ=$P(XMZREC,U),XMZFROM=$P(XMZREC,U,2),XMZDATE=$P(XMZREC,U,3)
|
---|
48 | S:XMZFROM="" XMZFROM=.5
|
---|
49 | ; If the sender of the original msg is not a recipient, make him one.
|
---|
50 | I XMZFROM=+XMZFROM,'$D(^XMB(3.9,XMZ,1,"C",XMZFROM)) D
|
---|
51 | . D ADDRECP(XMZ,$P(XMZREC,U,7)["P",XMZFROM)
|
---|
52 | . ;D LASTREAD(XMZ,XMZFROM,XMZDATE)
|
---|
53 | S XMZR=""
|
---|
54 | F S XMZR=$O(^XMBPOST(XMGROUP,XMQUEUE,XMTSTAMP,XMZ,XMZR)) Q:XMZR="" S XMREC=^(XMZR) D
|
---|
55 | . S XMMCNT=XMMCNT+1
|
---|
56 | . S XMRCNT=XMRCNT+$P(XMREC,U,1)
|
---|
57 | . I '$D(^XMB(3.9,XMZR)) D Q
|
---|
58 | . . N XMPARM S XMPARM(1)=XMZ,XMPARM(2)=XMZR
|
---|
59 | . . D BADERR(36241,.XMPARM) ; Response |2| to message |1| does not exist. Can't deliver it.
|
---|
60 | . ;S XMFDA(3.9001,"+1,"_XMZ_",",.01)=XMZR ; *** Moved to ^XMKP ***
|
---|
61 | . ;D UPDATE^DIE("","XMFDA") ; Add to response multiple in original msg
|
---|
62 | . S XMZRLIST(XMZR)="" ; (not used, but helps in debugging)
|
---|
63 | . S XMFROM=$P(XMREC,U,2)
|
---|
64 | . S:'$D(XMFIRST) XMFIRST=XMFROM
|
---|
65 | . S XMFLIST(XMFROM)=$G(XMFLIST(XMFROM))+1 ; Number of replies by this user
|
---|
66 | . Q:XMFROM="NR" ; Network reply *** If we implement fully networked mail, we must get the real sender, and make sure s/he's in the 'addressed to' and 'recipient' multiples.
|
---|
67 | . ; If the sender of the reply is not a recipient, make him one.
|
---|
68 | . I XMFROM,'$D(^XMB(3.9,XMZ,1,"C",XMFROM)) D ADDRECP(XMZ,$P(XMZREC,U,7)["P",XMFROM)
|
---|
69 | Q:'$D(XMFLIST)
|
---|
70 | I $O(XMFLIST(""))=XMFIRST,$O(XMFLIST(XMFIRST))="" S XMFROM=XMFIRST ; There's one sender
|
---|
71 | E S XMFROM="" ; There's multiple senders
|
---|
72 | ; At this point, XMFROM has the sender's DUZ (or 'NR' if remote)
|
---|
73 | ; if there was only 1 sender.
|
---|
74 | ; If there was more than 1 sender, then XMFROM="", so that ^XMTDL1 will
|
---|
75 | ; make the msg new for all recipients.
|
---|
76 | ; Now, deliver replies...
|
---|
77 | S XMRESPS=$P(^XMB(3.9,XMZ,3,0),U,4) ; Number of replies to msg
|
---|
78 | S XMTO=""
|
---|
79 | F S XMTO=$O(^XMB(3.9,XMZ,1,"C",XMTO)) Q:XMTO'>0 D
|
---|
80 | . S I=$O(^XMB(3.9,XMZ,1,"C",XMTO,0))
|
---|
81 | . Q:$G(^XMB(3.9,XMZ,1,I,"D")) ; User terminated
|
---|
82 | . I $D(XMFLIST(XMTO)) D:XMTO=XMFIRST GOTREPLY(XMZ,XMRESPS,I,XMFLIST(XMTO)) Q:XMTO=XMFROM ; If recipient is the only sender, don't bother delivering to him, because he's already seen it.
|
---|
83 | . Q:$P(^XMB(3.9,XMZ,1,I,0),U,2)=XMRESPS ; Don't deliver if recipient has already seen all responses
|
---|
84 | . S XMACNT=XMACNT+1
|
---|
85 | . D DELIVER^XMTDL2(XMTO,XMZ,XMZSUBJ,XMZFROM,XMFROM,1)
|
---|
86 | Q
|
---|
87 | ADDRECP(XMZ,XMPRI,XMRECP) ; Add a recipient to the message
|
---|
88 | N XMFDA
|
---|
89 | S XMFDA(3.91,"+1,"_XMZ_",",.01)=XMRECP
|
---|
90 | I XMPRI,+XMRECP=XMRECP,$P($G(^XMB(3.7,XMRECP,0)),U,11) S XMFDA(3.91,"+1,"_XMZ_",",10)=$P(^(0),U,11) ; priority response flag
|
---|
91 | D UPDATE^DIE("","XMFDA")
|
---|
92 | S XMFDA(3.911,"+1,"_XMZ_",",.01)=$$NAME^XMXUTIL(XMRECP)
|
---|
93 | D UPDATE^DIE("","XMFDA")
|
---|
94 | Q
|
---|
95 | LASTREAD(XMZ,XMZFROM,XMZDATE) ; Note that the sender has read the original message
|
---|
96 | N XMFDA,XMIEN
|
---|
97 | S XMIEN=$O(^XMB(3.9,XMZ,1,"C",XMZFROM,0)) Q:'XMIEN
|
---|
98 | S XMFDA(3.91,XMIEN_","_XMZ_",",1)=0 ; Read the original msg
|
---|
99 | S XMFDA(3.91,XMIEN_","_XMZ_",",2)=XMZDATE ; Last Read
|
---|
100 | S XMFDA(3.91,XMIEN_","_XMZ_",",11)=XMZDATE ; First Read
|
---|
101 | D FILE^DIE("","XMFDA")
|
---|
102 | Q
|
---|
103 | GOTREPLY(XMZ,XMRESPS,XMIEN,XMRNEW) ; Note that recipient has seen his own reply.
|
---|
104 | N XMFDA
|
---|
105 | ; If last reply seen + # responses made = total responses...
|
---|
106 | I $P(^XMB(3.9,XMZ,1,XMIEN,0),U,2)+XMRNEW=XMRESPS D
|
---|
107 | . S XMFDA(3.91,XMIEN_","_XMZ_",",1)=XMRESPS
|
---|
108 | . D FILE^DIE("","XMFDA")
|
---|
109 | Q
|
---|
110 | MDELIVER(XMGROUP,XMQUEUE,XMTSTAMP,XMUID,XMMCNT,XMRCNT,XMACNT) ; was ^XMADJF1
|
---|
111 | N XMZSUBJ,XMZFROM,XMZDATE,XMZPDATE,XMZBSKT,XMREC,XMZ,XMK,XMDEL,XMBCAST
|
---|
112 | ; Note: We know that XMGROUP="M" here
|
---|
113 | ; If $L(XMUID,U)>1, it's a forwarded message, else it's a new message.
|
---|
114 | S XMMCNT=1
|
---|
115 | S XMREC=^XMBPOST(XMGROUP,XMQUEUE,XMTSTAMP,XMUID)
|
---|
116 | S XMRCNT=+$P(XMREC,U,1)
|
---|
117 | S XMACNT=0
|
---|
118 | S XMZ=+XMUID
|
---|
119 | I '$D(^XMB(3.9,XMZ,0)) D Q
|
---|
120 | . I $L(XMUID,U)>1 K ^XMBPOST("FWD",XMUID_U_XMTSTAMP)
|
---|
121 | . D BADERR(36242,XMZ) ; Message |1| does not exist. Can't deliver it.
|
---|
122 | S XMZSUBJ=$P(^XMB(3.9,XMZ,0),U),XMZFROM=$P(^(0),U,2),XMZDATE=$P(^(0),U,3),XMZPDATE=$P(^(0),U,6)
|
---|
123 | S:XMZFROM="" XMZFROM=.5
|
---|
124 | I XMZPDATE,XMZPDATE'>DT D Q ; If purge date has passed, don't deliver
|
---|
125 | . I $L(XMUID,U)>1 K ^XMBPOST("FWD",XMUID_U_XMTSTAMP)
|
---|
126 | I $P(XMREC,U,2)'="" D ; basket selection
|
---|
127 | . I $L(XMUID,U)=1 S XMK(XMZFROM)=$P(XMREC,U,2) Q ; sending person
|
---|
128 | . I $P(XMUID,U,2) S XMK($P(XMUID,U,2))=$P(XMREC,U,2) ; forwarding person
|
---|
129 | I $P(XMREC,U,3)'="" S XMK(.6)=$P(XMREC,U,3)
|
---|
130 | I $P(XMREC,U,4) S XMDEL(.6)=$P(XMREC,U,4)
|
---|
131 | S XMBCAST=($P(XMREC,U,5)'="")
|
---|
132 | S XMZBSKT=$P($G(^XMB(3.9,XMZ,.5)),U,1)
|
---|
133 | I $L(XMUID,U)=1 D NEW(XMGROUP,XMQUEUE,XMTSTAMP,XMZ,XMBCAST,.XMK,.XMDEL,XMZSUBJ,XMZFROM,XMZDATE,XMZPDATE,XMZBSKT,.XMACNT) Q
|
---|
134 | D FORWARD(XMGROUP,XMQUEUE,XMTSTAMP,XMUID,XMZ,XMBCAST,.XMK,.XMDEL,XMZSUBJ,XMZFROM,XMZPDATE,XMZBSKT,.XMACNT)
|
---|
135 | Q
|
---|
136 | NEW(XMGROUP,XMQUEUE,XMTSTAMP,XMZ,XMBCAST,XMK,XMDEL,XMZSUBJ,XMZFROM,XMZDATE,XMZPDATE,XMZBSKT,XMACNT) ;
|
---|
137 | D:XMZFROM=+XMZFROM LASTREAD(XMZ,XMZFROM,XMZDATE)
|
---|
138 | I XMBCAST D BRODCAST^XMTDL1(XMZ,XMZSUBJ,XMZFROM,XMZFROM,.XMK,.XMDEL,XMZPDATE,XMZBSKT,.XMACNT)
|
---|
139 | N XMTO
|
---|
140 | S XMTO=0 ; Q: on next line ensures only local user delivery
|
---|
141 | F S XMTO=$O(^XMB(3.9,XMZ,1,"C",XMTO)) Q:XMTO'>0 D
|
---|
142 | . I XMBCAST,$D(^XMB(3.7,"M",XMZ,XMTO)) Q
|
---|
143 | . S XMACNT=XMACNT+1
|
---|
144 | . D DELIVER^XMTDL2(XMTO,XMZ,XMZSUBJ,XMZFROM,XMZFROM,0,$G(XMK(XMTO)),$G(XMDEL(XMTO),XMZPDATE),XMZBSKT)
|
---|
145 | Q
|
---|
146 | FORWARD(XMGROUP,XMQUEUE,XMTSTAMP,XMUID,XMZ,XMBCAST,XMK,XMDEL,XMZSUBJ,XMZFROM,XMZPDATE,XMZBSKT,XMACNT) ;
|
---|
147 | N I,J,XMFROM,XMTO,XMTOLIST
|
---|
148 | S XMFROM=$P(XMUID,U,2)
|
---|
149 | S XMUID=XMUID_U_XMTSTAMP
|
---|
150 | I XMBCAST D BRODCAST^XMTDL1(XMZ,XMZSUBJ,XMZFROM,XMFROM,.XMK,.XMDEL,XMZPDATE,XMZBSKT,.XMACNT) Q:'$D(^XMBPOST("FWD",XMUID))
|
---|
151 | S I=0
|
---|
152 | F S I=$O(^XMBPOST("FWD",XMUID,I)) Q:'I S XMTOLIST=^(I) D
|
---|
153 | . F J=1:1:$L(XMTOLIST,U) D
|
---|
154 | . . S XMTO=$P(XMTOLIST,U,J)
|
---|
155 | . . Q:$O(^XMB(3.7,"M",XMZ,XMTO,"")) ; User already has msg
|
---|
156 | . . Q:'$D(^XMB(3.9,XMZ,1,"C",XMTO)) ; User is not on recipient list (Should never happen
|
---|
157 | . . S XMACNT=XMACNT+1
|
---|
158 | . . D DELIVER^XMTDL2(XMTO,XMZ,XMZSUBJ,XMZFROM,XMFROM,0,$G(XMK(XMTO)),$G(XMDEL(XMTO),XMZPDATE),XMZBSKT)
|
---|
159 | K ^XMBPOST("FWD",XMUID)
|
---|
160 | Q
|
---|
161 | BADERR(XMDIALOG,XMPARM) ;
|
---|
162 | N XMTEXT,XMINSTR
|
---|
163 | D BLD^DIALOG(XMDIALOG,.XMPARM,"","XMTEXT")
|
---|
164 | S XMINSTR("FROM")="MailMan"
|
---|
165 | D TASKBULL^XMXBULL(DUZ,"XM_TRANSMISSION_ERROR","","XMTEXT",.5,.XMINSTR)
|
---|
166 | Q
|
---|