XMJBN1 ;ISC-SF/GMB-Access new mail in mailbox (cont.) ;04/06/2002 08:52
;;8.0;MailMan;;Jun 28, 2002
INIT(XMDUZ,XMK,XMKN,XMNEW,XMKMULT,XMABORT) ;
N I F I="N","N0" D BOGUS(XMDUZ,I)
D CHECK^XMVVITAE
I XMDUZ'=DUZ,'$$RPRIV^XMXSEC D Q
. S XMABORT=1
. D SHOW^XMJERR
S XMK=$O(^XMB(3.7,XMDUZ,"N0",0))
I XMK>0,XMK<1 D
. D FIXIT(XMDUZ)
. S XMK=$O(^XMB(3.7,XMDUZ,"N0",0))
I XMK="" D Q
. S XMABORT=1
. S $P(^XMB(3.7,XMDUZ,0),U,6)="" ; Just to make sure we're in synch.
. N XMPARM S XMPARM(2)=XMV("NAME")
. W !,$$EZBLD^DIALOG($S(XMDUZ=DUZ:34017,1:38156.2),.XMPARM) ; You have no new messages. / |2| has no new messages.
S XMNEW=$$TNMSGCT^XMXUTIL(XMDUZ)
I $O(^XMB(3.7,XMDUZ,"N0",XMK)) D
. S XMKMULT=1
. W !!,$$EZBLD^DIALOG($S(XMDUZ=DUZ:34019,1:34019.1),XMV("NAME")) ; You have/|1| has new mail in more than one basket
E S XMKMULT=0
S XMKN=$P(^XMB(3.7,XMDUZ,2,XMK,0),U)
Q
BOGUS(XMDUZ,XMTYPE) ; Check for and kill bogus node.
; This shouldn't be needed, but something (not MailMan) is setting it.
I $D(^XMB(3.7,XMDUZ,XMTYPE,0)) K ^XMB(3.7,XMDUZ,XMTYPE,0)
Q
FIXIT(XMDUZ) ; In case mail in the waste basket is new.
N XMK,XMZ
S (XMK,XMZ)=""
F S XMK=$O(^XMB(3.7,XMDUZ,"N0",XMK)) Q:XMK'<1!'XMK D
. F S XMZ=$O(^XMB(3.7,XMDUZ,"N0",XMK,XMZ)) Q:'XMZ D
. . D:$D(^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0)) NONEW^XMXUTIL(XMDUZ,XMK,XMZ,1)
. . K:$D(^XMB(3.7,XMDUZ,"N0",XMK,XMZ)) ^XMB(3.7,XMDUZ,"N0",XMK,XMZ)
. . K:$D(^XMB(3.7,XMDUZ,"N",XMK,XMZ)) ^XMB(3.7,XMDUZ,"N",XMK,XMZ)
Q
NXTBSKT(XMDUZ,XMTYPE,XMKN,XMK,XMKPRI) ;
D NXTINIT(XMDUZ,XMTYPE)
I '$D(^TMP("XM",$J,XMTYPE)) D Q
. S XMK=0,XMKN="",XMKPRI=0,XMKPRI("XMKN")=""
. K ^TMP("XM",$J,"APX")
F D Q:XMKN'=""
. I XMKN="" S XMKPRI=0,XMKPRI("XMKN")="" K ^TMP("XM",$J,"APX")
. I XMKN=XMKPRI("XMKN") D Q:XMKN'=""
. . D NXTPRI(XMDUZ,XMTYPE,.XMKPRI)
. . S XMKN=XMKPRI("XMKN")
. E S XMKPRI=0,XMKPRI("XMKN")=""
. F S XMKN=$O(^TMP("XM",$J,XMTYPE,XMKN)) Q:XMKN="" Q:'$D(^TMP("XM",$J,"APX",XMTYPE,XMKN))
S XMK=^TMP("XM",$J,XMTYPE,XMKN)
K ^TMP("XM",$J,XMTYPE)
Q
NXTINIT(XMDUZ,XMTYPE) ;
N XMK,XMKN
K ^TMP("XM",$J,XMTYPE)
D BOGUS(XMDUZ,XMTYPE)
S XMK=0
F S XMK=$O(^XMB(3.7,XMDUZ,XMTYPE,XMK)) Q:'XMK D
. S XMKN=$P(^XMB(3.7,XMDUZ,2,XMK,0),U)
. S ^TMP("XM",$J,XMTYPE,XMKN)=XMK
Q
NXTPRI(XMDUZ,XMTYPE,XMKPRI) ;
I XMKPRI=100 S XMKPRI("XMKN")="" Q
I $D(^XMB(3.7,XMDUZ,2,"AP")) D I XMKPRI S ^TMP("XM",$J,"APX",XMTYPE,XMKPRI("XMKN"))="" Q
. N XMK,XMKN
. K ^TMP("XM",$J,"AP")
. S:XMKPRI XMKPRI=XMKPRI-.1
. S XMK=0
. F S XMKPRI=$O(^XMB(3.7,XMDUZ,2,"AP",XMKPRI)) Q:'XMKPRI D Q:XMKPRI("XMKN")'=""
. . F S XMK=$O(^XMB(3.7,XMDUZ,2,"AP",XMKPRI,XMK)) Q:'XMK D
. . . S XMKN=$P(^XMB(3.7,XMDUZ,2,XMK,0),U)
. . . Q:'$D(^TMP("XM",$J,XMTYPE,XMKN))
. . . S ^TMP("XM",$J,"AP",XMKPRI,XMKN)=""
. . S XMKPRI("XMKN")=$O(^TMP("XM",$J,"AP",XMKPRI,XMKPRI("XMKN")))
. K ^TMP("XM",$J,"AP")
S XMKPRI=100
N XMIN
S XMIN=$$EZBLD^DIALOG(37005) ; IN
I $D(^TMP("XM",$J,XMTYPE,XMIN)) S XMKPRI("XMKN")=XMIN,^TMP("XM",$J,"APX",XMTYPE,XMKPRI("XMKN"))="" Q
S XMKPRI("XMKN")=""
Q
; It used to be that the list of messages to "new" was kept in ^TMP.
; But if the user got forced off for some reason, the global was lost,
; and the messages were never "new"ed. So I changed to ^XTMP. We check
; ^XTMP whenever a user logs on (in ^XMVVITAE).
; Possible problem: one user is in the middle of reading new messages
; and "new"ing ones he wants to have "new" again, and a surrogate logs
; on, and triggers an immediate "new"ing of all those messages.
; I think it's an acceptable risk. Maybe not.
; This may be a case of 'damned if you do; damned if you don't'.
; Perhaps we should also check ^XTMP in the wee hours of the morning
; (in ^XMTDT), just in case the user doesn't log on again.
NEWAGAIN(XMDUZ) ; "new" messages which the user wanted to "new".
S ^XTMP("XM",0)=$$FMADD^XLFDT(DT,7)_U_DT
N XMZ,XMK
S XMZ=""
F S XMZ=$O(^XTMP("XM","MAKENEW",XMDUZ,XMZ)) Q:XMZ="" D K ^XTMP("XM","MAKENEW",XMDUZ,XMZ)
. S XMK=$O(^XMB(3.7,"M",XMZ,XMDUZ,0)) Q:'XMK
. Q:$D(^XMB(3.7,XMDUZ,"N0",XMK,XMZ))
. D MAKENEW^XMXUTIL(XMDUZ,XMK,XMZ,1)
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXMJBN1 4182 printed Nov 22, 2024@17:21:54 Page 2
XMJBN1 ;ISC-SF/GMB-Access new mail in mailbox (cont.) ;04/06/2002 08:52
+1 ;;8.0;MailMan;;Jun 28, 2002
INIT(XMDUZ,XMK,XMKN,XMNEW,XMKMULT,XMABORT) ;
+1 NEW I
FOR I="N","N0"
DO BOGUS(XMDUZ,I)
+2 DO CHECK^XMVVITAE
+3 IF XMDUZ'=DUZ
IF '$$RPRIV^XMXSEC
Begin DoDot:1
+4 SET XMABORT=1
+5 DO SHOW^XMJERR
End DoDot:1
QUIT
+6 SET XMK=$ORDER(^XMB(3.7,XMDUZ,"N0",0))
+7 IF XMK>0
IF XMK<1
Begin DoDot:1
+8 DO FIXIT(XMDUZ)
+9 SET XMK=$ORDER(^XMB(3.7,XMDUZ,"N0",0))
End DoDot:1
+10 IF XMK=""
Begin DoDot:1
+11 SET XMABORT=1
+12 ; Just to make sure we're in synch.
SET $PIECE(^XMB(3.7,XMDUZ,0),U,6)=""
+13 NEW XMPARM
SET XMPARM(2)=XMV("NAME")
+14 ; You have no new messages. / |2| has no new messages.
WRITE !,$$EZBLD^DIALOG($SELECT(XMDUZ=DUZ:34017,1:38156.2),.XMPARM)
End DoDot:1
QUIT
+15 SET XMNEW=$$TNMSGCT^XMXUTIL(XMDUZ)
+16 IF $ORDER(^XMB(3.7,XMDUZ,"N0",XMK))
Begin DoDot:1
+17 SET XMKMULT=1
+18 ; You have/|1| has new mail in more than one basket
WRITE !!,$$EZBLD^DIALOG($SELECT(XMDUZ=DUZ:34019,1:34019.1),XMV("NAME"))
End DoDot:1
+19 IF '$TEST
SET XMKMULT=0
+20 SET XMKN=$PIECE(^XMB(3.7,XMDUZ,2,XMK,0),U)
+21 QUIT
BOGUS(XMDUZ,XMTYPE) ; Check for and kill bogus node.
+1 ; This shouldn't be needed, but something (not MailMan) is setting it.
+2 IF $DATA(^XMB(3.7,XMDUZ,XMTYPE,0))
KILL ^XMB(3.7,XMDUZ,XMTYPE,0)
+3 QUIT
FIXIT(XMDUZ) ; In case mail in the waste basket is new.
+1 NEW XMK,XMZ
+2 SET (XMK,XMZ)=""
+3 FOR
SET XMK=$ORDER(^XMB(3.7,XMDUZ,"N0",XMK))
if XMK'<1!'XMK
QUIT
Begin DoDot:1
+4 FOR
SET XMZ=$ORDER(^XMB(3.7,XMDUZ,"N0",XMK,XMZ))
if 'XMZ
QUIT
Begin DoDot:2
+5 if $DATA(^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0))
DO NONEW^XMXUTIL(XMDUZ,XMK,XMZ,1)
+6 if $DATA(^XMB(3.7,XMDUZ,"N0",XMK,XMZ))
KILL ^XMB(3.7,XMDUZ,"N0",XMK,XMZ)
+7 if $DATA(^XMB(3.7,XMDUZ,"N",XMK,XMZ))
KILL ^XMB(3.7,XMDUZ,"N",XMK,XMZ)
End DoDot:2
End DoDot:1
+8 QUIT
NXTBSKT(XMDUZ,XMTYPE,XMKN,XMK,XMKPRI) ;
+1 DO NXTINIT(XMDUZ,XMTYPE)
+2 IF '$DATA(^TMP("XM",$JOB,XMTYPE))
Begin DoDot:1
+3 SET XMK=0
SET XMKN=""
SET XMKPRI=0
SET XMKPRI("XMKN")=""
+4 KILL ^TMP("XM",$JOB,"APX")
End DoDot:1
QUIT
+5 FOR
Begin DoDot:1
+6 IF XMKN=""
SET XMKPRI=0
SET XMKPRI("XMKN")=""
KILL ^TMP("XM",$JOB,"APX")
+7 IF XMKN=XMKPRI("XMKN")
Begin DoDot:2
+8 DO NXTPRI(XMDUZ,XMTYPE,.XMKPRI)
+9 SET XMKN=XMKPRI("XMKN")
End DoDot:2
if XMKN'=""
QUIT
+10 IF '$TEST
SET XMKPRI=0
SET XMKPRI("XMKN")=""
+11 FOR
SET XMKN=$ORDER(^TMP("XM",$JOB,XMTYPE,XMKN))
if XMKN=""
QUIT
if '$DATA(^TMP("XM",$JOB,"APX",XMTYPE,XMKN))
QUIT
End DoDot:1
if XMKN'=""
QUIT
+12 SET XMK=^TMP("XM",$JOB,XMTYPE,XMKN)
+13 KILL ^TMP("XM",$JOB,XMTYPE)
+14 QUIT
NXTINIT(XMDUZ,XMTYPE) ;
+1 NEW XMK,XMKN
+2 KILL ^TMP("XM",$JOB,XMTYPE)
+3 DO BOGUS(XMDUZ,XMTYPE)
+4 SET XMK=0
+5 FOR
SET XMK=$ORDER(^XMB(3.7,XMDUZ,XMTYPE,XMK))
if 'XMK
QUIT
Begin DoDot:1
+6 SET XMKN=$PIECE(^XMB(3.7,XMDUZ,2,XMK,0),U)
+7 SET ^TMP("XM",$JOB,XMTYPE,XMKN)=XMK
End DoDot:1
+8 QUIT
NXTPRI(XMDUZ,XMTYPE,XMKPRI) ;
+1 IF XMKPRI=100
SET XMKPRI("XMKN")=""
QUIT
+2 IF $DATA(^XMB(3.7,XMDUZ,2,"AP"))
Begin DoDot:1
+3 NEW XMK,XMKN
+4 KILL ^TMP("XM",$JOB,"AP")
+5 if XMKPRI
SET XMKPRI=XMKPRI-.1
+6 SET XMK=0
+7 FOR
SET XMKPRI=$ORDER(^XMB(3.7,XMDUZ,2,"AP",XMKPRI))
if 'XMKPRI
QUIT
Begin DoDot:2
+8 FOR
SET XMK=$ORDER(^XMB(3.7,XMDUZ,2,"AP",XMKPRI,XMK))
if 'XMK
QUIT
Begin DoDot:3
+9 SET XMKN=$PIECE(^XMB(3.7,XMDUZ,2,XMK,0),U)
+10 if '$DATA(^TMP("XM",$JOB,XMTYPE,XMKN))
QUIT
+11 SET ^TMP("XM",$JOB,"AP",XMKPRI,XMKN)=""
End DoDot:3
+12 SET XMKPRI("XMKN")=$ORDER(^TMP("XM",$JOB,"AP",XMKPRI,XMKPRI("XMKN")))
End DoDot:2
if XMKPRI("XMKN")'=""
QUIT
+13 KILL ^TMP("XM",$JOB,"AP")
End DoDot:1
IF XMKPRI
SET ^TMP("XM",$JOB,"APX",XMTYPE,XMKPRI("XMKN"))=""
QUIT
+14 SET XMKPRI=100
+15 NEW XMIN
+16 ; IN
SET XMIN=$$EZBLD^DIALOG(37005)
+17 IF $DATA(^TMP("XM",$JOB,XMTYPE,XMIN))
SET XMKPRI("XMKN")=XMIN
SET ^TMP("XM",$JOB,"APX",XMTYPE,XMKPRI("XMKN"))=""
QUIT
+18 SET XMKPRI("XMKN")=""
+19 QUIT
+20 ; It used to be that the list of messages to "new" was kept in ^TMP.
+21 ; But if the user got forced off for some reason, the global was lost,
+22 ; and the messages were never "new"ed. So I changed to ^XTMP. We check
+23 ; ^XTMP whenever a user logs on (in ^XMVVITAE).
+24 ; Possible problem: one user is in the middle of reading new messages
+25 ; and "new"ing ones he wants to have "new" again, and a surrogate logs
+26 ; on, and triggers an immediate "new"ing of all those messages.
+27 ; I think it's an acceptable risk. Maybe not.
+28 ; This may be a case of 'damned if you do; damned if you don't'.
+29 ; Perhaps we should also check ^XTMP in the wee hours of the morning
+30 ; (in ^XMTDT), just in case the user doesn't log on again.
NEWAGAIN(XMDUZ) ; "new" messages which the user wanted to "new".
+1 SET ^XTMP("XM",0)=$$FMADD^XLFDT(DT,7)_U_DT
+2 NEW XMZ,XMK
+3 SET XMZ=""
+4 FOR
SET XMZ=$ORDER(^XTMP("XM","MAKENEW",XMDUZ,XMZ))
if XMZ=""
QUIT
Begin DoDot:1
+5 SET XMK=$ORDER(^XMB(3.7,"M",XMZ,XMDUZ,0))
if 'XMK
QUIT
+6 if $DATA(^XMB(3.7,XMDUZ,"N0",XMK,XMZ))
QUIT
+7 DO MAKENEW^XMXUTIL(XMDUZ,XMK,XMZ,1)
End DoDot:1
KILL ^XTMP("XM","MAKENEW",XMDUZ,XMZ)
+8 QUIT