ZISPQ ;IRMFO-ALB/CJM - DEVICE HANDLER PRINT QUEUES;10/05/2011 ;08/01/2012
;;8.0;KERNEL;**585**;JUL 10, 9;Build 23
;Per VHA Directive 10-93-142, this routine should not be modified.
;
QEXIST(DEVICE) ;
;Check if print queue exists for this device on this system
;
;Input:
; DEVICE = ien of device
;Output:
; Function returns 1 if queue associated with DEVICE exists, 0 otherwise
;
N OS,PQ
S PQ=$$GETPQ(DEVICE)
Q:PQ="" 0
S OS=$$OS^%ZOSV()
I OS["UNIX" Q $$LQEXIST(PQ)
E I OS["VMS" Q $$VQEXIST(PQ)
Q 0
;
OPEN ;called from PQ^%ZIS6
;
;override %ZIS input parameters and device file parameters for printer queues
;
W:'$D(IOP) !
D:'POP&(%ZISB&(%ZIS'["T"))
.K %ZIS("IOPAR"),%ZIS("IOUPAR")
.S %ZISTO=2
.S $P(%ZTIME,"^",3)="n"
.I $$OS^%ZOSV()["UNIX" D
..S %ZISOPAR="(""NWU"":/TER=$CHAR(13))"
.E D
..S %ZISOPAR="(""NWS"")"
.S %ZISUPAR=""
.S IO=$$NEWJOB(%E,+$G(DUZ)) ;get a unique name for host file
.Q:IO=""
.I $$FEXIST(IO) D FDELETE(IO) ;make sure the file does not exist - it should not!
.S %ZISLOCK=$NA(^%ZIS("lock",IO))
.D O^%ZIS4
.I POP D STATUS(IO,"QE")
;
Q
;
DIR(CODE) ;get directory for printer queues, a subdirectory of host file directory
;Input - CODE (optional) 1 for primary, 2 for secondary. If not passed, the directory of the current process is assumed
N DIR
I '$G(CODE) S CODE=$$PRI^%ZOSV
S DIR=$$CHKNM^%ZISF($P($G(^XTV(8989.3,1,"DEV")),"^",CODE))
I $$OS^%ZOSV()["VMS" D
.S DIR=$P(DIR,"]")_".print_queues]"
E D
.I $E(DIR,$L(DIR))'="/" S DIR=DIR_"/"
.S DIR=DIR_"print_queues/"
Q DIR
;
NEWJOB(DEVICE,DUZ) ;
;Creates a new entry in the PRINT QUEUE JOB file and creates a unique
;name for the print file.
;
;Input:
; DEVICE - ien of the device
; DUZ
;Output:
; Function value - returns the full path name of the host file for the print queue.
;
N I,DATA,DIR,PQ,JOB
I '$G(DEVICE) S POP=1 Q ""
;
;Get the name of the print queue
S PQ=$$GETPQ(DEVICE)
I PQ="" S POP=1 Q ""
;
S DATA(.01)=DEVICE,DATA(.02)=$$NOW^XLFDT,DATA(.04)=DUZ,DATA(.05)=PQ,DATA(.09)=$$PRI^%ZOSV
S JOB=$$ADD^ZISFM(3.52,,.DATA,.ERROR)
Q:'JOB ""
;
;add the status
S DATA(.07)="O"
;add the filename -including the UCI and ien guarantees it to be unique
S DATA(.06)="PQ$"_$$UCI_"_"_JOB_".TXT"
D UPD^ZISFM(3.52,JOB,.DATA,.ERROR)
Q $$DIR_DATA(.06)
;
STATUS(IO,STATUS,JOBID) ;Set the status of the PRINT QUEUE JOB
;Input:
; IO - file name, may include or not include the path, the ien is parsed out.
; STATUS (optional) status code. If ="" returns the current status.
; JOBID (optional) The job id. Should be passed in if the status is 'Q'ueued
;Output:
; function returns the current status
;
N IEN,DATA,ERROR
Q:'$L($G(IO)) ""
S IEN=$$GETIEN(IO)
Q:IEN="" ""
I $G(STATUS)="" Q $P($G(^%ZIS(3.52,IEN,0)),"^",7)
I $L($G(JOBID)) S DATA(.08)=JOBID
S DATA(.07)=STATUS
I $E(STATUS,1)="Q" S DATA(.03)=$$NOW^XLFDT
I STATUS="C",$P($G(^%ZIS(3.52,IEN,0)),"^",7)="C" S DATA(.03)=$$NOW^XLFDT
D UPD^ZISFM(3.52,IEN,.DATA,.ERROR)
Q STATUS
;
CLOSE(IO) ;Called from ^%ZISC. Closes the host file and passes it to the print queue
;
N JOBID,STATUS
;
S STATUS=$$STATUS(IO)
;
;queued tasks are calling CLOSE logic twice, check for that
I (STATUS="Q")!(STATUS="P")!(STATUS="D") Q
;
I '$$PRINT(IO,.JOBID) S STATUS="QE"
E S STATUS="Q"
D STATUS(IO,STATUS,$G(JOBID))
Q
;
VQEXIST(Q) ; Tests if queue exists on this node - VMS
;Function returns 1 if the queue exists, 0 if it doesn't
;
N CMD,RET
S CMD="PIPE Q = F$GETQUI(""DISPLAY_QUEUE"",""QUEUE_NAME"","""_Q_""")"
S CMD=CMD_" ; IF F$LENGTH(Q) .EQ. 0 THEN DEFINE/JOB ZIS$VAL 0 ; IF F$LENGTH(Q) .GT. 0 THEN DEFINE/JOB ZIS$VAL 1 "
I $ZF(-1,CMD)
S RET=$ZF("TRNLNM","ZIS$VAL","LNM$JOB")
I $ZF(-1,"DEASSIGN/JOB ZIS$VAL")
Q +$G(RET)
;
LQEXIST(Q) ; Tests if queue exists - LINUX
N EOF,CMD,RESULTS,RET
S EOF=$ZU(68,40,1)
S CMD="lpstat -p "_$$REPLACE(Q,"$","'$'")_" 2> /dev/null"
O CMD:"qr" U CMD R RESULTS:2 C CMD
I RESULTS]"" S RET=1
S EOF=$ZU(68,40,EOF)
Q +$G(RET)
;
PRINT(FILE,JOBID) ;Submits the file to be printed.
;Input:
; FILE - full file name, including path
;Output:
; function value - returns 1 on success, 0 on failure
; JOBID (pass by reference) on sucess may return the job id for the print job (not guaranteed)
N OS,JOB
S JOB=FILE
Q:'$$GETJOB(.JOB) 0
S OS=$$OS^%ZOSV()
I OS["UNIX" Q $$LPRINT(FILE,JOB("QUEUE"),.JOBID)
I OS["VMS" Q $$VPRINT(FILE,JOB("QUEUE"),.JOBID)
Q 0
;
LPRINT(FILE,Q,JOBID) ;
N CMD,RESULT,EOF,RET
S RET=0,JOBID=""
S CMD="lpr -r -P"_Q_" "_FILE_" && echo success && lpq -P "_Q
S CMD=$$REPLACE(CMD,"$","'$'")
S EOF=$ZU(68,40,1)
O CMD:"QR":5 Q:'$T U CMD D C CMD
.R RESULT:5 Q:'$T Q:RESULT=""
.I RESULT["success" D
..N NAME
..S NAME="PQ$JOB_"_$P(FILE,"PQ$JOB_",2)
..S RET=1
..F R RESULT:5 Q:'$T Q:RESULT="" I RESULT[NAME S JOBID=$$INVERT^XLFSTR($P($$INVERT^XLFSTR($$TRIM^XLFSTR($P(RESULT,NAME),"R"))," ")) Q
S EOF=$ZU(68,40,EOF)
Q RET
;
VPRINT(FILE,Q,JOBID) ; VMS Print
;First determine the /PASS or /NOPASS parameter
N CMD,PASS,NOPASS,RET
S RET=0,JOBID=""
S CMD="PIPE DESCR = F$GETQUI(""DISPLAY_QUEUE"",""QUEUE_DESCRIPTION"","""_Q_""")"
S CMD=CMD_" ; IF F$LOCATE( ""/NOPASS"",DESCR) .LT. F$LENGTH(DESCR) THEN DEFINE/JOB ZIS$VAL 1 "
I $ZF(-1,CMD)
;
S NOPASS=+$ZF("TRNLNM","ZIS$VAL","LNM$JOB")
I $ZF(-1,"DEASSIGN/JOB/NOLOG ZIS$VAL")
S PASS=$S(NOPASS:"/NOPASS",1:"/PASS")
;
;Build the complete VMS PRINT command
S CMD="PIPE PRINT/DELETE"_PASS_"/NOIDENTITY/QUEUE="""_Q_""" "_FILE_" /PARAM=NOFLAG ; IF $STATUS THEN DEFINE/JOB ZIS$VAL &$ENTRY "
;
I $ZF(-1,CMD)=1 D
.S JOBID=$ZF("TRNLNM","ZIS$VAL","LNM$JOB")
I JOBID'="",$ZF(-1,"DEASSIGN/JOB/NOLOG ZIS$VAL")
Q JOBID'=""
;
GETPQ(DEVICE) ;
;Given the ien of the DEVICE, it returns the name of the print queue,
;parsed from the $I or SECONDARY $I field of the DEVICE
;
;Returns "" on failure
;
Q:'$G(DEVICE) ""
N PQ
;
;get $I and parse out the name of the print queue
S:$$PRI^%ZOSV=2 PQ=$P($G(^%ZIS(1,DEVICE,2)),"^")
S:$G(PQ)="" PQ=$P($G(^%ZIS(1,DEVICE,0)),"^",2)
;
;$I field might look like this: DEV:[TEMP]HF_QUEUE.TXT - parse out thequeue name
I PQ[":" S PQ=$P(PQ,":",2)
S PQ=$P(PQ,".",1)
I PQ["]" S PQ=$P(PQ,"]",2)
;
Q PQ
;
REPLACE(STRING,SUB1,SUB2) ;
N REPLACE
S REPLACE(SUB1)=SUB2
Q $$REPLACE^XLFSTR(STRING,.REPLACE)
;
ID ;identifier logic on the PRINT QUEUES JOB file
N ID,NAME,DATE
S NAME=$P(^(0),"^",4)
S DATE=$P(^(0),"^",2)
I NAME S NAME=$$LJ^XLFSTR($P($G(^VA(200,NAME,0)),"^"),18)_" "
I DATE S DATE=$$FMTE^XLFDT(DATE)
S ID=$E(NAME,1,20)_" "_DATE
D EN^DDIOL(ID,"")
Q
;
PURGE ;Purge of PRINT JOB QUEUES (file #3.52) and old host files that were queued. Also updates status on a regular basis.
;
N DEVICE,STATUS,TIME,IEN,DIR,T1,T2,T3,NOW
S NOW=$$NOW^XLFDT
S ZTREQ=""
;
;set time parameters for this purge
S T1=$$FMADD^XLFDT(NOW,,-1) ;10 minutes ago
S T2=$$FMADD^XLFDT(NOW,-1) ;24 hours ago
S T3=$$FMADD^XLFDT(NOW,-2) ;48 hours ago
;
S DIR=$$PRI^%ZOSV
;
L +%ZIS(3.52,"PURGE JOB"_DIR):0 Q:'$T ;allow only one purge at a time on each system (primary, secondary)
;
;look for queued jobs older than 10 minutes whose status can be changed to 'PRINTED & DELETED'
S STATUS="Q"
S DEVICE=0
F S DEVICE=$O(^%ZIS(3.52,"E",DIR,DEVICE)) Q:'DEVICE D
.S TIME=T2 F S TIME=$O(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME)) Q:'TIME Q:TIME>T1 D
..S IEN=0 F S IEN=$O(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN)) Q:'IEN D
...N JOB S JOB=IEN
...I '$$GETJOB(.JOB) Q
...;if the host file is gone, it has been printed
...I $$FEXIST(JOB("FILE")) D STATUS(JOB("FILE"),"D")
;
;delete host files older than 24 hours
S DEVICE=0
F S DEVICE=$O(^%ZIS(3.52,"E",DIR,DEVICE)) Q:'DEVICE D
.Q:$$STOPPED(DEVICE)
.S STATUS=""
.F S STATUS=$O(^%ZIS(3.52,"E",DIR,DEVICE,STATUS)) Q:STATUS="" I STATUS'="P",STATUS'="D" D
..S TIME=0
..F S TIME=$O(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME)) Q:'TIME Q:TIME>T2 D
...S IEN=0 F S IEN=$O(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN)) Q:'IEN D
....N JOB S JOB=IEN
....I '$$GETJOB(.JOB) K ^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN) Q
....;delete the host file if it exists and change the status
....I $$FEXIST(JOB("FILE")) D FDELETE(JOB("FILE")),STATUS(JOB("FILE"),"D")
;
;delete jobs (file #3.52) older than 48 hours
S DEVICE=0
F S DEVICE=$O(^%ZIS(3.52,"E",DIR,DEVICE)) Q:'DEVICE D
.Q:$$STOPPED(DEVICE)
.S STATUS="" F S STATUS=$O(^%ZIS(3.52,"E",DIR,DEVICE,STATUS)) Q:STATUS="" D
..S TIME=0 F S TIME=$O(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME)) Q:'TIME Q:TIME>T3 D
...S IEN=0 F S IEN=$O(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN)) Q:'IEN D
....N JOB S JOB=IEN
....I '$$GETJOB(.JOB) K ^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN) Q
....;delete the job entry (file #3.52)
....D JDELETE(IEN)
;
L -%ZIS(3.52,"PURGE JOB"_DIR)
Q
;
GETJOB(JOB) ;returns job info (file 3.52). Input JOB=ien OR the name of the host file, returns .JOB array with job's fields
N NODE,FILE,DIR,IEN
S IEN=$G(JOB)
I 'IEN,$L(IEN) S IEN=$$GETIEN(IEN)
Q:'IEN ""
S JOB("IEN")=IEN
S NODE=$G(^%ZIS(3.52,IEN,0))
Q:NODE="" 0
S JOB("QUEUE")=$P(NODE,"^",5)
S JOB("ID")=$P(NODE,"^",8)
S FILE=$P(NODE,"^",6)
S DIR=$P(NODE,"^",9)
S DIR=$$DIR(DIR)
S FILE=DIR_FILE
S JOB("FILE")=FILE
Q 1
;
STOPPED(DEVICE) ;was purging suspended for this device?
N RET
S RET=$P($G(^%ZIS(1,+DEVICE,0)),"^",13)
I RET="N" Q 1
Q 0
;
FEXIST(FILE) ;returns 1 if the file exists, 0 otherwise
;
N OS S OS=$$OS^%ZOSV()
I OS["UNIX" Q $$LFEXIST(FILE)
E I OS["VMS" Q $$VFEXIST(FILE)
Q 0
;
VFEXIST(FILE) ;checks file's existance - VMS
N CMD,RET
S CMD="PIPE F = F$SEARCH("""_FILE_""")"
S CMD=CMD_" ; IF F$LENGTH(F) .EQ. 0 THEN DEFINE/JOB ZIS$VAL 0 ; IF F$LENGTH(F) .GT. 0 THEN DEFINE/JOB ZIS$VAL 1 "
I $ZF(-1,CMD)
S RET=$ZF("TRNLNM","ZIS$VAL","LNM$JOB")
I $ZF(-1,"DEASSIGN/JOB ZIS$VAL")
Q +$G(RET)
;
LFEXIST(FILE) ;checks file's existance - Linux,Unix
N CMD
S CMD="[ -f "_$$REPLACE(FILE,"$","'$'")_" ]"
Q '$ZF(-1,CMD)
;
FDELETE(FILE) ;delete file
N OS S OS=$$OS^%ZOSV()
I OS["UNIX" D LFDELETE(FILE)
E I OS["VMS" D VFDELETE(FILE)
Q
;
VFDELETE(FILE) ;delete file - VMS
N CMD
I FILE'[";" S FILE=FILE_";*"
S CMD="DELETE "_FILE
I $ZF(-1,CMD)
Q
;
LFDELETE(FILE) ;delete file - Linux,Unix
N CMD
S CMD="rm -f "_$$REPLACE(FILE,"$","'$'")
I $ZF(-1,CMD)
Q
;
JDELETE(IEN) ;delete the job, file #3.52
D DELETE^ZISFM(3.52,IEN)
Q
;
DEQUEUE(JOBID,QUEUE) ;Remove a job from a queue
N OS S OS=$$OS^%ZOSV()
I OS["UNIX" Q $$LDEQUEUE(JOBID,QUEUE)
E I OS["VMS" Q $$VDEQUEUE(JOBID,QUEUE)
Q
;
VDEQUEUE(JOBID,QUEUE) ;Remove a job from a queue - VMS
I $ZF(-1,"DELETE /ENTRY="_JOBID_" "_QUEUE)
Q
;
LDEQUEUE(JOBID,QUEUE) ;Remove a job from a queue - Linux, Unix
N CMD
S CMD="lprm -P "_$$REPLACE(QUEUE,"$","'$'")_" "_JOBID
I $ZF(-1,CMD)
Q
UCI() ;return the UCI
N Y
X ^%ZOSF("UCI")
Q $P(Y,",")
;
GETIEN(FILE) ;given the file name, parses out the ien and returns it
Q $P($P(FILE,"PQ$"_$$UCI_"_",2),".TXT")
;
;
;
;
ZISPQ ;IRMFO-ALB/CJM - DEVICE HANDLER PRINT QUEUES;10/05/2011 ;08/01/2012
+1 ;;8.0;KERNEL;**585**;JUL 10, 9;Build 23
+2 ;Per VHA Directive 10-93-142, this routine should not be modified.
+3 ;
QEXIST(DEVICE) ;
+1 ;Check if print queue exists for this device on this system
+2 ;
+3 ;Input:
+4 ; DEVICE = ien of device
+5 ;Output:
+6 ; Function returns 1 if queue associated with DEVICE exists, 0 otherwise
+7 ;
+8 NEW OS,PQ
+9 SET PQ=$$GETPQ(DEVICE)
+10 IF PQ=""
QUIT 0
+11 SET OS=$$OS^%ZOSV()
+12 IF OS["UNIX"
QUIT $$LQEXIST(PQ)
+13 IF '$TEST
IF OS["VMS"
QUIT $$VQEXIST(PQ)
+14 QUIT 0
+15 ;
OPEN ;called from PQ^%ZIS6
+1 ;
+2 ;override %ZIS input parameters and device file parameters for printer queues
+3 ;
+4 IF '$DATA(IOP)
WRITE !
+5 IF 'POP&(%ZISB&(%ZIS'["T"))
Begin DoDot:1
+6 KILL %ZIS("IOPAR"),%ZIS("IOUPAR")
+7 SET %ZISTO=2
+8 SET $PIECE(%ZTIME,"^",3)="n"
+9 IF $$OS^%ZOSV()["UNIX"
Begin DoDot:2
+10 SET %ZISOPAR="(""NWU"":/TER=$CHAR(13))"
End DoDot:2
+11 IF '$TEST
Begin DoDot:2
+12 SET %ZISOPAR="(""NWS"")"
End DoDot:2
+13 SET %ZISUPAR=""
+14 ;get a unique name for host file
SET IO=$$NEWJOB(%E,+$GET(DUZ))
+15 IF IO=""
QUIT
+16 ;make sure the file does not exist - it should not!
IF $$FEXIST(IO)
DO FDELETE(IO)
+17 SET %ZISLOCK=$NAME(^%ZIS("lock",IO))
+18 DO O^%ZIS4
+19 IF POP
DO STATUS(IO,"QE")
End DoDot:1
+20 ;
+21 QUIT
+22 ;
DIR(CODE) ;get directory for printer queues, a subdirectory of host file directory
+1 ;Input - CODE (optional) 1 for primary, 2 for secondary. If not passed, the directory of the current process is assumed
+2 NEW DIR
+3 IF '$GET(CODE)
SET CODE=$$PRI^%ZOSV
+4 SET DIR=$$CHKNM^%ZISF($PIECE($GET(^XTV(8989.3,1,"DEV")),"^",CODE))
+5 IF $$OS^%ZOSV()["VMS"
Begin DoDot:1
+6 SET DIR=$PIECE(DIR,"]")_".print_queues]"
End DoDot:1
+7 IF '$TEST
Begin DoDot:1
+8 IF $EXTRACT(DIR,$LENGTH(DIR))'="/"
SET DIR=DIR_"/"
+9 SET DIR=DIR_"print_queues/"
End DoDot:1
+10 QUIT DIR
+11 ;
NEWJOB(DEVICE,DUZ) ;
+1 ;Creates a new entry in the PRINT QUEUE JOB file and creates a unique
+2 ;name for the print file.
+3 ;
+4 ;Input:
+5 ; DEVICE - ien of the device
+6 ; DUZ
+7 ;Output:
+8 ; Function value - returns the full path name of the host file for the print queue.
+9 ;
+10 NEW I,DATA,DIR,PQ,JOB
+11 IF '$GET(DEVICE)
SET POP=1
QUIT ""
+12 ;
+13 ;Get the name of the print queue
+14 SET PQ=$$GETPQ(DEVICE)
+15 IF PQ=""
SET POP=1
QUIT ""
+16 ;
+17 SET DATA(.01)=DEVICE
SET DATA(.02)=$$NOW^XLFDT
SET DATA(.04)=DUZ
SET DATA(.05)=PQ
SET DATA(.09)=$$PRI^%ZOSV
+18 SET JOB=$$ADD^ZISFM(3.52,,.DATA,.ERROR)
+19 IF 'JOB
QUIT ""
+20 ;
+21 ;add the status
+22 SET DATA(.07)="O"
+23 ;add the filename -including the UCI and ien guarantees it to be unique
+24 SET DATA(.06)="PQ$"_$$UCI_"_"_JOB_".TXT"
+25 DO UPD^ZISFM(3.52,JOB,.DATA,.ERROR)
+26 QUIT $$DIR_DATA(.06)
+27 ;
STATUS(IO,STATUS,JOBID) ;Set the status of the PRINT QUEUE JOB
+1 ;Input:
+2 ; IO - file name, may include or not include the path, the ien is parsed out.
+3 ; STATUS (optional) status code. If ="" returns the current status.
+4 ; JOBID (optional) The job id. Should be passed in if the status is 'Q'ueued
+5 ;Output:
+6 ; function returns the current status
+7 ;
+8 NEW IEN,DATA,ERROR
+9 IF '$LENGTH($GET(IO))
QUIT ""
+10 SET IEN=$$GETIEN(IO)
+11 IF IEN=""
QUIT ""
+12 IF $GET(STATUS)=""
QUIT $PIECE($GET(^%ZIS(3.52,IEN,0)),"^",7)
+13 IF $LENGTH($GET(JOBID))
SET DATA(.08)=JOBID
+14 SET DATA(.07)=STATUS
+15 IF $EXTRACT(STATUS,1)="Q"
SET DATA(.03)=$$NOW^XLFDT
+16 IF STATUS="C"
IF $PIECE($GET(^%ZIS(3.52,IEN,0)),"^",7)="C"
SET DATA(.03)=$$NOW^XLFDT
+17 DO UPD^ZISFM(3.52,IEN,.DATA,.ERROR)
+18 QUIT STATUS
+19 ;
CLOSE(IO) ;Called from ^%ZISC. Closes the host file and passes it to the print queue
+1 ;
+2 NEW JOBID,STATUS
+3 ;
+4 SET STATUS=$$STATUS(IO)
+5 ;
+6 ;queued tasks are calling CLOSE logic twice, check for that
+7 IF (STATUS="Q")!(STATUS="P")!(STATUS="D")
QUIT
+8 ;
+9 IF '$$PRINT(IO,.JOBID)
SET STATUS="QE"
+10 IF '$TEST
SET STATUS="Q"
+11 DO STATUS(IO,STATUS,$GET(JOBID))
+12 QUIT
+13 ;
VQEXIST(Q) ; Tests if queue exists on this node - VMS
+1 ;Function returns 1 if the queue exists, 0 if it doesn't
+2 ;
+3 NEW CMD,RET
+4 SET CMD="PIPE Q = F$GETQUI(""DISPLAY_QUEUE"",""QUEUE_NAME"","""_Q_""")"
+5 SET CMD=CMD_" ; IF F$LENGTH(Q) .EQ. 0 THEN DEFINE/JOB ZIS$VAL 0 ; IF F$LENGTH(Q) .GT. 0 THEN DEFINE/JOB ZIS$VAL 1 "
+6 IF $ZF(-1,CMD)
+7 SET RET=$ZF("TRNLNM","ZIS$VAL","LNM$JOB")
+8 IF $ZF(-1,"DEASSIGN/JOB ZIS$VAL")
+9 QUIT +$GET(RET)
+10 ;
LQEXIST(Q) ; Tests if queue exists - LINUX
+1 NEW EOF,CMD,RESULTS,RET
+2 SET EOF=$ZU(68,40,1)
+3 SET CMD="lpstat -p "_$$REPLACE(Q,"$","'$'")_" 2> /dev/null"
+4 OPEN CMD:"qr"
USE CMD
READ RESULTS:2
CLOSE CMD
+5 IF RESULTS]""
SET RET=1
+6 SET EOF=$ZU(68,40,EOF)
+7 QUIT +$GET(RET)
+8 ;
PRINT(FILE,JOBID) ;Submits the file to be printed.
+1 ;Input:
+2 ; FILE - full file name, including path
+3 ;Output:
+4 ; function value - returns 1 on success, 0 on failure
+5 ; JOBID (pass by reference) on sucess may return the job id for the print job (not guaranteed)
+6 NEW OS,JOB
+7 SET JOB=FILE
+8 IF '$$GETJOB(.JOB)
QUIT 0
+9 SET OS=$$OS^%ZOSV()
+10 IF OS["UNIX"
QUIT $$LPRINT(FILE,JOB("QUEUE"),.JOBID)
+11 IF OS["VMS"
QUIT $$VPRINT(FILE,JOB("QUEUE"),.JOBID)
+12 QUIT 0
+13 ;
LPRINT(FILE,Q,JOBID) ;
+1 NEW CMD,RESULT,EOF,RET
+2 SET RET=0
SET JOBID=""
+3 SET CMD="lpr -r -P"_Q_" "_FILE_" && echo success && lpq -P "_Q
+4 SET CMD=$$REPLACE(CMD,"$","'$'")
+5 SET EOF=$ZU(68,40,1)
+6 OPEN CMD:"QR":5
IF '$TEST
QUIT
USE CMD
Begin DoDot:1
+7 READ RESULT:5
IF '$TEST
QUIT
IF RESULT=""
QUIT
+8 IF RESULT["success"
Begin DoDot:2
+9 NEW NAME
+10 SET NAME="PQ$JOB_"_$PIECE(FILE,"PQ$JOB_",2)
+11 SET RET=1
+12 FOR
READ RESULT:5
IF '$TEST
QUIT
IF RESULT=""
QUIT
IF RESULT[NAME
SET JOBID=$$INVERT^XLFSTR($PIECE($$INVERT^XLFSTR($$TRIM^XLFSTR($PIECE(RESULT,NAME),"R"))," "))
QUIT
End DoDot:2
End DoDot:1
CLOSE CMD
+13 SET EOF=$ZU(68,40,EOF)
+14 QUIT RET
+15 ;
VPRINT(FILE,Q,JOBID) ; VMS Print
+1 ;First determine the /PASS or /NOPASS parameter
+2 NEW CMD,PASS,NOPASS,RET
+3 SET RET=0
SET JOBID=""
+4 SET CMD="PIPE DESCR = F$GETQUI(""DISPLAY_QUEUE"",""QUEUE_DESCRIPTION"","""_Q_""")"
+5 SET CMD=CMD_" ; IF F$LOCATE( ""/NOPASS"",DESCR) .LT. F$LENGTH(DESCR) THEN DEFINE/JOB ZIS$VAL 1 "
+6 IF $ZF(-1,CMD)
+7 ;
+8 SET NOPASS=+$ZF("TRNLNM","ZIS$VAL","LNM$JOB")
+9 IF $ZF(-1,"DEASSIGN/JOB/NOLOG ZIS$VAL")
+10 SET PASS=$SELECT(NOPASS:"/NOPASS",1:"/PASS")
+11 ;
+12 ;Build the complete VMS PRINT command
+13 SET CMD="PIPE PRINT/DELETE"_PASS_"/NOIDENTITY/QUEUE="""_Q_""" "_FILE_" /PARAM=NOFLAG ; IF $STATUS THEN DEFINE/JOB ZIS$VAL &$ENTRY "
+14 ;
+15 IF $ZF(-1,CMD)=1
Begin DoDot:1
+16 SET JOBID=$ZF("TRNLNM","ZIS$VAL","LNM$JOB")
End DoDot:1
+17 IF JOBID'=""
IF $ZF(-1,"DEASSIGN/JOB/NOLOG ZIS$VAL")
+18 QUIT JOBID'=""
+19 ;
GETPQ(DEVICE) ;
+1 ;Given the ien of the DEVICE, it returns the name of the print queue,
+2 ;parsed from the $I or SECONDARY $I field of the DEVICE
+3 ;
+4 ;Returns "" on failure
+5 ;
+6 IF '$GET(DEVICE)
QUIT ""
+7 NEW PQ
+8 ;
+9 ;get $I and parse out the name of the print queue
+10 IF $$PRI^%ZOSV=2
SET PQ=$PIECE($GET(^%ZIS(1,DEVICE,2)),"^")
+11 IF $GET(PQ)=""
SET PQ=$PIECE($GET(^%ZIS(1,DEVICE,0)),"^",2)
+12 ;
+13 ;$I field might look like this: DEV:[TEMP]HF_QUEUE.TXT - parse out thequeue name
+14 IF PQ[":"
SET PQ=$PIECE(PQ,":",2)
+15 SET PQ=$PIECE(PQ,".",1)
+16 IF PQ["]"
SET PQ=$PIECE(PQ,"]",2)
+17 ;
+18 QUIT PQ
+19 ;
REPLACE(STRING,SUB1,SUB2) ;
+1 NEW REPLACE
+2 SET REPLACE(SUB1)=SUB2
+3 QUIT $$REPLACE^XLFSTR(STRING,.REPLACE)
+4 ;
ID ;identifier logic on the PRINT QUEUES JOB file
+1 NEW ID,NAME,DATE
+2 SET NAME=$PIECE(^(0),"^",4)
+3 SET DATE=$PIECE(^(0),"^",2)
+4 IF NAME
SET NAME=$$LJ^XLFSTR($PIECE($GET(^VA(200,NAME,0)),"^"),18)_" "
+5 IF DATE
SET DATE=$$FMTE^XLFDT(DATE)
+6 SET ID=$EXTRACT(NAME,1,20)_" "_DATE
+7 DO EN^DDIOL(ID,"")
+8 QUIT
+9 ;
PURGE ;Purge of PRINT JOB QUEUES (file #3.52) and old host files that were queued. Also updates status on a regular basis.
+1 ;
+2 NEW DEVICE,STATUS,TIME,IEN,DIR,T1,T2,T3,NOW
+3 SET NOW=$$NOW^XLFDT
+4 SET ZTREQ=""
+5 ;
+6 ;set time parameters for this purge
+7 ;10 minutes ago
SET T1=$$FMADD^XLFDT(NOW,,-1)
+8 ;24 hours ago
SET T2=$$FMADD^XLFDT(NOW,-1)
+9 ;48 hours ago
SET T3=$$FMADD^XLFDT(NOW,-2)
+10 ;
+11 SET DIR=$$PRI^%ZOSV
+12 ;
+13 ;allow only one purge at a time on each system (primary, secondary)
LOCK +%ZIS(3.52,"PURGE JOB"_DIR):0
IF '$TEST
QUIT
+14 ;
+15 ;look for queued jobs older than 10 minutes whose status can be changed to 'PRINTED & DELETED'
+16 SET STATUS="Q"
+17 SET DEVICE=0
+18 FOR
SET DEVICE=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE))
IF 'DEVICE
QUIT
Begin DoDot:1
+19 SET TIME=T2
FOR
SET TIME=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME))
IF 'TIME
QUIT
IF TIME>T1
QUIT
Begin DoDot:2
+20 SET IEN=0
FOR
SET IEN=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN))
IF 'IEN
QUIT
Begin DoDot:3
+21 NEW JOB
SET JOB=IEN
+22 IF '$$GETJOB(.JOB)
QUIT
+23 ;if the host file is gone, it has been printed
+24 IF $$FEXIST(JOB("FILE"))
DO STATUS(JOB("FILE"),"D")
End DoDot:3
End DoDot:2
End DoDot:1
+25 ;
+26 ;delete host files older than 24 hours
+27 SET DEVICE=0
+28 FOR
SET DEVICE=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE))
IF 'DEVICE
QUIT
Begin DoDot:1
+29 IF $$STOPPED(DEVICE)
QUIT
+30 SET STATUS=""
+31 FOR
SET STATUS=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE,STATUS))
IF STATUS=""
QUIT
IF STATUS'="P"
IF STATUS'="D"
Begin DoDot:2
+32 SET TIME=0
+33 FOR
SET TIME=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME))
IF 'TIME
QUIT
IF TIME>T2
QUIT
Begin DoDot:3
+34 SET IEN=0
FOR
SET IEN=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN))
IF 'IEN
QUIT
Begin DoDot:4
+35 NEW JOB
SET JOB=IEN
+36 IF '$$GETJOB(.JOB)
KILL ^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN)
QUIT
+37 ;delete the host file if it exists and change the status
+38 IF $$FEXIST(JOB("FILE"))
DO FDELETE(JOB("FILE"))
DO STATUS(JOB("FILE"),"D")
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+39 ;
+40 ;delete jobs (file #3.52) older than 48 hours
+41 SET DEVICE=0
+42 FOR
SET DEVICE=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE))
IF 'DEVICE
QUIT
Begin DoDot:1
+43 IF $$STOPPED(DEVICE)
QUIT
+44 SET STATUS=""
FOR
SET STATUS=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE,STATUS))
IF STATUS=""
QUIT
Begin DoDot:2
+45 SET TIME=0
FOR
SET TIME=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME))
IF 'TIME
QUIT
IF TIME>T3
QUIT
Begin DoDot:3
+46 SET IEN=0
FOR
SET IEN=$ORDER(^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN))
IF 'IEN
QUIT
Begin DoDot:4
+47 NEW JOB
SET JOB=IEN
+48 IF '$$GETJOB(.JOB)
KILL ^%ZIS(3.52,"E",DIR,DEVICE,STATUS,TIME,IEN)
QUIT
+49 ;delete the job entry (file #3.52)
+50 DO JDELETE(IEN)
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+51 ;
+52 LOCK -%ZIS(3.52,"PURGE JOB"_DIR)
+53 QUIT
+54 ;
GETJOB(JOB) ;returns job info (file 3.52). Input JOB=ien OR the name of the host file, returns .JOB array with job's fields
+1 NEW NODE,FILE,DIR,IEN
+2 SET IEN=$GET(JOB)
+3 IF 'IEN
IF $LENGTH(IEN)
SET IEN=$$GETIEN(IEN)
+4 IF 'IEN
QUIT ""
+5 SET JOB("IEN")=IEN
+6 SET NODE=$GET(^%ZIS(3.52,IEN,0))
+7 IF NODE=""
QUIT 0
+8 SET JOB("QUEUE")=$PIECE(NODE,"^",5)
+9 SET JOB("ID")=$PIECE(NODE,"^",8)
+10 SET FILE=$PIECE(NODE,"^",6)
+11 SET DIR=$PIECE(NODE,"^",9)
+12 SET DIR=$$DIR(DIR)
+13 SET FILE=DIR_FILE
+14 SET JOB("FILE")=FILE
+15 QUIT 1
+16 ;
STOPPED(DEVICE) ;was purging suspended for this device?
+1 NEW RET
+2 SET RET=$PIECE($GET(^%ZIS(1,+DEVICE,0)),"^",13)
+3 IF RET="N"
QUIT 1
+4 QUIT 0
+5 ;
FEXIST(FILE) ;returns 1 if the file exists, 0 otherwise
+1 ;
+2 NEW OS
SET OS=$$OS^%ZOSV()
+3 IF OS["UNIX"
QUIT $$LFEXIST(FILE)
+4 IF '$TEST
IF OS["VMS"
QUIT $$VFEXIST(FILE)
+5 QUIT 0
+6 ;
VFEXIST(FILE) ;checks file's existance - VMS
+1 NEW CMD,RET
+2 SET CMD="PIPE F = F$SEARCH("""_FILE_""")"
+3 SET CMD=CMD_" ; IF F$LENGTH(F) .EQ. 0 THEN DEFINE/JOB ZIS$VAL 0 ; IF F$LENGTH(F) .GT. 0 THEN DEFINE/JOB ZIS$VAL 1 "
+4 IF $ZF(-1,CMD)
+5 SET RET=$ZF("TRNLNM","ZIS$VAL","LNM$JOB")
+6 IF $ZF(-1,"DEASSIGN/JOB ZIS$VAL")
+7 QUIT +$GET(RET)
+8 ;
LFEXIST(FILE) ;checks file's existance - Linux,Unix
+1 NEW CMD
+2 SET CMD="[ -f "_$$REPLACE(FILE,"$","'$'")_" ]"
+3 QUIT '$ZF(-1,CMD)
+4 ;
FDELETE(FILE) ;delete file
+1 NEW OS
SET OS=$$OS^%ZOSV()
+2 IF OS["UNIX"
DO LFDELETE(FILE)
+3 IF '$TEST
IF OS["VMS"
DO VFDELETE(FILE)
+4 QUIT
+5 ;
VFDELETE(FILE) ;delete file - VMS
+1 NEW CMD
+2 IF FILE'[";"
SET FILE=FILE_";*"
+3 SET CMD="DELETE "_FILE
+4 IF $ZF(-1,CMD)
+5 QUIT
+6 ;
LFDELETE(FILE) ;delete file - Linux,Unix
+1 NEW CMD
+2 SET CMD="rm -f "_$$REPLACE(FILE,"$","'$'")
+3 IF $ZF(-1,CMD)
+4 QUIT
+5 ;
JDELETE(IEN) ;delete the job, file #3.52
+1 DO DELETE^ZISFM(3.52,IEN)
+2 QUIT
+3 ;
DEQUEUE(JOBID,QUEUE) ;Remove a job from a queue
+1 NEW OS
SET OS=$$OS^%ZOSV()
+2 IF OS["UNIX"
QUIT $$LDEQUEUE(JOBID,QUEUE)
+3 IF '$TEST
IF OS["VMS"
QUIT $$VDEQUEUE(JOBID,QUEUE)
+4 QUIT
+5 ;
VDEQUEUE(JOBID,QUEUE) ;Remove a job from a queue - VMS
+1 IF $ZF(-1,"DELETE /ENTRY="_JOBID_" "_QUEUE)
+2 QUIT
+3 ;
LDEQUEUE(JOBID,QUEUE) ;Remove a job from a queue - Linux, Unix
+1 NEW CMD
+2 SET CMD="lprm -P "_$$REPLACE(QUEUE,"$","'$'")_" "_JOBID
+3 IF $ZF(-1,CMD)
+4 QUIT
UCI() ;return the UCI
+1 NEW Y
+2 XECUTE ^%ZOSF("UCI")
+3 QUIT $PIECE(Y,",")
+4 ;
GETIEN(FILE) ;given the file name, parses out the ien and returns it
+1 QUIT $PIECE($PIECE(FILE,"PQ$"_$$UCI_"_",2),".TXT")
+2 ;
+3 ;
+4 ;
+5 ;