- XQSMD6 ;SFISC/JDS - SECURE MENU DELEGATION UTILITIES ;03/02/98 10:40 [ 04/02/2003 8:29 AM ]
- ;;8.0;KERNEL;**1005,1007**;APR 1, 2003
- ;;8.0;KERNEL;**72**;NOV 13, 1997
- Q
- ;
- ; Entry to lookup all Keys associated with a Menu
- ; INPUT - MENULIST ARRAY --- (passed by reference)
- ; MENULIST(0) = Total number of Menus to start with
- ; MENULIST(1) = 1st Menu IEN
- ; MENULIST(2) - 2nd Menu IEN
- ; ...etc
- ; OUTPUT - ABORT = 1 if IEN doesn't exist --- (passed by reference)
- ; XQKEY ARRAY --- (passed by reference)
- ; XQKEY(0) = Total number of Keys
- ; XQKEY(1) = 1st Key found
- ; XQKEY(2) = 2nd Key found
- ; ...etc
- ;
- KEYS(MENULIST,XQKEY,ABORT) ;
- ; Order thru menu structure in search of locks
- S ABORT=0 D CHECK Q:ABORT
- ;
- K ^XTMP($J,"XQSMD6")
- M ^XTMP($J,"XQSMD6")=MENULIST
- F X=1:1:MENULIST(0) S ^XTMP($J,"XQSMD6","B",MENULIST(X))=""
- ;
- N XQJ,KEY,PIEN,CNT
- S XQJ="",XQKEY="",XQKEY(0)=0
- ;
- PROCESS ;
- F CNT=1:1 S PIEN=$G(^XTMP($J,"XQSMD6",CNT)) Q:PIEN="" D BUILD
- ;
- K ^XTMP($J,"XQSMD6"),XQKEY("B")
- Q
- ;
- BUILD ;
- ; 1st check to see if this option is still on the system,
- ; then check to see if a key is locking this option
- ;
- Q:'$D(^DIC(19,PIEN,0))
- I $P(^DIC(19,PIEN,0),U,6)]"" D KEYADD
- ;
- ; check to see if this option has any children
- S XQJ=""
- F S XQJ=$O(^DIC(19,PIEN,10,"B",XQJ)) Q:XQJ="" D CHILDADD
- Q
- ;
- CHILDADD ;
- ; Add a child to the list of children
- ; quit if child is already in the list
- ;
- Q:$D(^XTMP($J,"XQSMD6","B",XQJ))
- S ^XTMP($J,"XQSMD6",0)=^XTMP($J,"XQSMD6",0)+1
- S ^XTMP($J,"XQSMD6",^XTMP($J,"XQSMD6",0))=XQJ
- S ^XTMP($J,"XQSMD6","B",XQJ)=""
- I ^XTMP($J,"XQSMD6",0)#100=0 W "."
- Q
- KEYADD ;
- ; Add a key to the list of keys needed
- ;
- S KEY=$P(^DIC(19,PIEN,0),U,6)
- ;
- ; quit if key is already in the list
- Q:$D(XQKEY("B",KEY))
- S XQKEY(0)=XQKEY(0)+1
- S XQKEY(XQKEY(0))=KEY
- S XQKEY("B",KEY)=""
- Q
- CHECK ;
- ; ensure that IEN passed in is in option file ^DIC(19,
- ;
- I '$D(^DIC(19,MENULIST(1),0)) D
- . S ABORT=1
- . W !!,?7,"Aborting key search, Option File IEN "_IEN_" doesn't exist!",!!
- Q
- XQSMD6 ;SFISC/JDS - SECURE MENU DELEGATION UTILITIES ;03/02/98 10:40 [ 04/02/2003 8:29 AM ]
- +1 ;;8.0;KERNEL;**1005,1007**;APR 1, 2003
- +2 ;;8.0;KERNEL;**72**;NOV 13, 1997
- +3 QUIT
- +4 ;
- +5 ; Entry to lookup all Keys associated with a Menu
- +6 ; INPUT - MENULIST ARRAY --- (passed by reference)
- +7 ; MENULIST(0) = Total number of Menus to start with
- +8 ; MENULIST(1) = 1st Menu IEN
- +9 ; MENULIST(2) - 2nd Menu IEN
- +10 ; ...etc
- +11 ; OUTPUT - ABORT = 1 if IEN doesn't exist --- (passed by reference)
- +12 ; XQKEY ARRAY --- (passed by reference)
- +13 ; XQKEY(0) = Total number of Keys
- +14 ; XQKEY(1) = 1st Key found
- +15 ; XQKEY(2) = 2nd Key found
- +16 ; ...etc
- +17 ;
- KEYS(MENULIST,XQKEY,ABORT) ;
- +1 ; Order thru menu structure in search of locks
- +2 SET ABORT=0
- DO CHECK
- IF ABORT
- QUIT
- +3 ;
- +4 KILL ^XTMP($JOB,"XQSMD6")
- +5 MERGE ^XTMP($JOB,"XQSMD6")=MENULIST
- +6 FOR X=1:1:MENULIST(0)
- SET ^XTMP($JOB,"XQSMD6","B",MENULIST(X))=""
- +7 ;
- +8 NEW XQJ,KEY,PIEN,CNT
- +9 SET XQJ=""
- SET XQKEY=""
- SET XQKEY(0)=0
- +10 ;
- PROCESS ;
- +1 FOR CNT=1:1
- SET PIEN=$GET(^XTMP($JOB,"XQSMD6",CNT))
- IF PIEN=""
- QUIT
- DO BUILD
- +2 ;
- +3 KILL ^XTMP($JOB,"XQSMD6"),XQKEY("B")
- +4 QUIT
- +5 ;
- BUILD ;
- +1 ; 1st check to see if this option is still on the system,
- +2 ; then check to see if a key is locking this option
- +3 ;
- +4 IF '$DATA(^DIC(19,PIEN,0))
- QUIT
- +5 IF $PIECE(^DIC(19,PIEN,0),U,6)]""
- DO KEYADD
- +6 ;
- +7 ; check to see if this option has any children
- +8 SET XQJ=""
- +9 FOR
- SET XQJ=$ORDER(^DIC(19,PIEN,10,"B",XQJ))
- IF XQJ=""
- QUIT
- DO CHILDADD
- +10 QUIT
- +11 ;
- CHILDADD ;
- +1 ; Add a child to the list of children
- +2 ; quit if child is already in the list
- +3 ;
- +4 IF $DATA(^XTMP($JOB,"XQSMD6","B",XQJ))
- QUIT
- +5 SET ^XTMP($JOB,"XQSMD6",0)=^XTMP($JOB,"XQSMD6",0)+1
- +6 SET ^XTMP($JOB,"XQSMD6",^XTMP($JOB,"XQSMD6",0))=XQJ
- +7 SET ^XTMP($JOB,"XQSMD6","B",XQJ)=""
- +8 IF ^XTMP($JOB,"XQSMD6",0)#100=0
- WRITE "."
- +9 QUIT
- KEYADD ;
- +1 ; Add a key to the list of keys needed
- +2 ;
- +3 SET KEY=$PIECE(^DIC(19,PIEN,0),U,6)
- +4 ;
- +5 ; quit if key is already in the list
- +6 IF $DATA(XQKEY("B",KEY))
- QUIT
- +7 SET XQKEY(0)=XQKEY(0)+1
- +8 SET XQKEY(XQKEY(0))=KEY
- +9 SET XQKEY("B",KEY)=""
- +10 QUIT
- CHECK ;
- +1 ; ensure that IEN passed in is in option file ^DIC(19,
- +2 ;
- +3 IF '$DATA(^DIC(19,MENULIST(1),0))
- Begin DoDot:1
- +4 SET ABORT=1
- +5 WRITE !!,?7,"Aborting key search, Option File IEN "_IEN_" doesn't exist!",!!
- End DoDot:1
- +6 QUIT