Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: VENPCCP1

VENPCCP1.m

Go to the documentation of this file.
  1. VENPCCP1 ; IHS/OIT/GIS - FACILITY PRINT DEAMON ;
  1. ;;2.6;PCC+;**1,3**;APR 03, 2012;Build 24
  1. ;
  1. ; NEW PRINT DEAMON ; ERROR TRAPPING
  1. ; WORKS WITH NEW PRINT SERVICE
  1. ;
  1. NEW N FILE,PATH,POP,REC,A,B,DFN,IP,IPA,SOCKET,%,CNT,RESULT,VISIT,SWAP,DUZ,VER25,LASTFILE
  1. N VENIO,X,Y,Z,I,FIRST,NEXT,DEL,TOT,TMP,MSG,WAIT,CFIGIEN,TYPE,PGIEN,MRPFLAG,DEFEF,VENDEV
  1. S X="TRAP^VENPCCP1",@^%ZOSF("TRAP") K ERRSTOP ; SET ERROR TRAP
  1. S Y=0
  1. I '$$INIT S %=$$STOP Q ; INITIALIZE LOCAL VARIABLES FROM CONFIG FILE ENTRIES
  1. CYCLE I $$STOP Q ; EXTRNAL HALT
  1. I $D(^TMP("VEN SYNC")) D SYNC^VENPCCM1 K ^TMP("VEN SYNC") G CYCLE ; PRINT DEAMON SYNC FUNCTIONS
  1. INC S CNT=CNT+1
  1. S @TMP=("Wait cycle #"_CNT)
  1. I $P($G(^VEN(7.5,CFIGIEN,0)),U,21),$P($G(^VEN(7.5,CFIGIEN,0)),U,22)'=DT D CLEAN^VENPCCP3
  1. H 5 ; CHECK EMPTY DIRECTORY EVERY 5 SECONDS
  1. FILE I $$STOP Q
  1. S FILE=$$NEXT(PATH,"A.txt") I FILE="" G CYCLE ; KEEP CYCLING IF DIRECTORY EMPTY
  1. OPEN I $$STOP Q ; GET THE RECORD FROM THE DATA FILE
  1. REC I $G(VER25) S POP=$$OPN^VENPCCP(PATH,FILE,"R","D CHUNK^VENPCCP1") I 1 ; IN 2.5, BUILD REC ARRAY IMMEDIATLY
  1. E S POP=$$OPN^VENPCCP(PATH,FILE,"R","R REC") ; FOR BKWD COMPATIBILITY: RETURN DATA IN THE REC STRING
  1. I POP D DEL^VENPCCP1(PATH,FILE) G INC ; CAN'T OPEN DATA FILE. UNIX PERMISSIONS PROBLEM!!!
  1. I '$L($G(REC)),'$L($G(REC(1))) G DFILE ; DELETE A NULL RECORD AND START OVER
  1. BAL I $L(FILE)>5 D ; LOAD BALANCING
  1. . F I=($L(FILE)-4):-1:1 S %=$E(FILE,I) I %=+% Q ; GET LOAD BALANCING NUMBER
  1. . I (+%)#2 S %=IP,IP=IPA,IPA=% ; BALANCE THE LOAD
  1. . Q
  1. MSG S TOT=$$COUNT(PATH) ; MONITOR MSG
  1. S MSG=TOT_" file"_$S(TOT>1:"s",1:"")_" in queue. Processing "_FILE S @TMP=MSG
  1. TRANSMIT S RESULT=$$SEND^VENPCCP(SOCKET,IP,IPA) K REC ; TRANSMIT THE FILE TO THE PRINT SERVER!
  1. I $$STOP Q ; EXTERNAL HALT
  1. BAD I 'RESULT S FILE=$$NEXT(PATH,FILE) G:FILE'="" OPEN G INC ; GET NEXT Z FILE
  1. GOOD ; !!!SUCCESS!!!
  1. D CLEAN(PGIEN) ; CLEAN UP ANY EXISTING ERROR FLAGS
  1. DFILE D DEL(PATH,FILE) ; DELETE DATA FILE FROM PRINT DIRECTORY
  1. RECYCLE I $E(FILE)="Z"!($E(FILE)="z") G FILE ; GET NEXT FILE
  1. S %=$E(FILE) S TYPE=$S(%="E":"H",%="H":"G",%="e":"h",%="h":"g",%="G":"H",%="g":"h",1:"")
  1. I $L(TYPE) S FILE=TYPE_$E(FILE,2,99) I $$FIND^VENPCCP(PATH,FILE) G OPEN ; PRINT DOCUMENTS AS A GROUP IF POSSIBLE
  1. G FILE
  1. ;
  1. CHUNK ; EP - REBUILD THE RECORD IN SMALL CHUNKS THAT WILL FIT THRU THE "OPEN" WINDOW.
  1. ; THIS CODE ADDED TO AVOID THE MAXSTG AND STKOVR ERRORS EXPERIENCED UNDER VER 2.2
  1. N I,%,X
  1. F I=1:1 R %:10 Q:'$L(%) D
  1. . F X=10,13 S %=$TR(%,$C(X),"") ; STRIP OFF <RETURN> FROM END OF THE RECORD
  1. . S REC(I)=%
  1. . Q
  1. Q
  1. ;
  1. ; -----------------------------------------------
  1. ;
  1. ; NEW GENERIC FUNCTIONS FOR PRINT DEAMON
  1. ;
  1. INIT() ; EP-INITIALIZE VARIABLES AND RETURN '1' IF SUCCESSFUL
  1. N %
  1. S TMP="^TMP(""VEN TASK"",$J)" S @TMP="",CNT=0,U="^"
  1. S CFIGIEN=$$CFG^VENPCCU I 'CFIGIEN D REG^VENPCCP2(10,"MISSING/INVALID CONFIGURATION") Q 0
  1. S %=$C(68,85,90),@%@(0)=$C(64),%=$C(68,84)
  1. S @%=$$HTFM^XLFDT($H,1)
  1. I $P($G(^VEN(7.5,CFIGIEN,13)),U) S VER25=1 ; FLAG FOR NEW PRINT SERVICE
  1. I $P($G(^VEN(7.5,CFIGIEN,0)),"^",12)=1 Q 0 ; BYPASS PRINTING - FOR TEST PURPOSES ONLY
  1. S PATH=$G(^VEN(7.5,CFIGIEN,1))
  1. I '$L(PATH) D REG^VENPCCP2(10,"Missing path to Print Folder") Q 0
  1. S SOCKET=$P($G(^VEN(7.5,CFIGIEN,11)),U,3)
  1. I SOCKET="" D REG^VENPCCP2(10,"Missing/Invalid Socket") Q 0
  1. I (SOCKET<1)!(SOCKET>65535) D REG^VENPCCP2(10,"Invalid socket number") Q 0
  1. IP S IP=$P($G(^VEN(7.5,CFIGIEN,11)),U,1) I IP="" D REG^VENPCCP2(10,"Missing IP Address") Q 0
  1. I IP'?1.3N1P1.3N1P1.3N1P1.3N D REG^VENPCCP2(10,"Print Server #1 IP address not in the correct format") Q 0
  1. S IPA=$P($G(^VEN(7.5,CFIGIEN,11)),U,2) I IPA="" S IPA=IP
  1. E I IPA'?1.3N1P1.3N1P1.3N1P1.3N D REG^VENPCCP2(10,"Print Server #2 IP address not in the correct format") Q 0
  1. I '$$OS^VENPCCU,$$VEN^VENPCCU=1 S %="S X=$"_"Z",FIRST=%_"OS(12,PF,0)",NEXT=%_"OS(13,X)",DEL=%_"OS(2,PF)"
  1. Q 1
  1. ;
  1. EF(MN) ; EP-GIVEN A TEMPLATE MENEMONIC, RETURN THE TEMLATE IEN
  1. I $G(MN)="" Q ""
  1. N EIEN,X
  1. S EIEN=0
  1. F S EIEN=$O(^VEN(7.41,EIEN)) Q:'EIEN S X=^(EIEN,0) I $P(X,U,3)=MN Q
  1. Q EIEN
  1. ;
  1. NEXT(PATH,FILE) ; EP-DISPLAY THE NEXT FILE IN A DIRECTORY, SET LASTFILE
  1. I $L(PATH),$L(FILE)
  1. E Q ""
  1. N TMP
  1. S TMP="^TMP(""VEN Z FILES"","""_$J_""")" K @TMP
  1. D FILES^VENPCCP2(PATH,TMP) ; PUT FILES IN PRINT FOLDER INTO AN ARRAY
  1. I $E($G(LASTFILE))="e",$D(@TMP@(LASTFILE)) D DEL(PATH,LASTFILE) K @TMP@(LASTFILE) ; CLEAR OUT NON 'Z' PREVIOUS TRYS
  1. F S FILE=$O(@TMP@(FILE)) Q:FILE="" I FILE[".txt"!(FILE[".TXT") Q
  1. K @TMP
  1. S LASTFILE=FILE
  1. Q FILE
  1. ;
  1. COUNT(PATH) ; EP-COUNT THE TEXT FILES IN A DIRECTORY
  1. I '$L(PATH) Q ""
  1. N TMP,FILE,TOT
  1. S TOT=0,FILE="A.txt"
  1. S TMP="^TMP(""VEN Z FILES"","""_$J_""")" K @TMP
  1. D FILES^VENPCCP2(PATH,TMP) ; PUT TXT FILES IN PRINT FOLDER INTO AN ARRAY
  1. F S FILE=$O(@TMP@(FILE)) Q:FILE="" I FILE[".txt"!(FILE[".TXT") S TOT=TOT+1
  1. K @TMP
  1. Q TOT
  1. ;
  1. CLEAN(PGIEN) ; EP-CANCELS ERROR GLOBALS
  1. K ^TMP("VEN ERROR FLAG",1),^(4)
  1. I $G(PGIEN) K ^TMP("VEN ERROR FLAG",2,PGIEN)
  1. Q
  1. ;
  1. STOP() ; EP-EXTERNAL HALT
  1. N X S X=0
  1. F S X=$O(^TMP("VEN TASK",X)) Q:'X I X'=$J D ; FIRST, MAKE SURE NO OTHER PRINT DEAMON PROCESSES ARE RUNNING
  1. . K ^TMP("VEN TASK",X) ; INDIRECT WAY TO STOP ANOTHER PROCESS
  1. . I $P($G(^VEN(7.5,$$CFG^VENPCCU,0)),U,5)=2 X ("S %=$Z"_"UTIL(4,X)") ; DIECTLY STOP ANOTHER PRINT DEAMON PROCESS ; CACHE ONLY
  1. . Q
  1. I $G(ERRSTOP) Q 1
  1. I '$D(^TMP("VEN TASK",$J)) Q 1 ; CHECK PRINT DEAMON FLAG FOR CURRENT TPROCESS ; IF THE FLAG HAS BEEN KILLED, TERMINATE THIS PROCESS NOW
  1. I ^TMP("VEN TASK",$J)["FATAL ERROR" Q 1 ; IF FATAL ERROR PRESENT, TERMINATE THIS PROCESS NOW
  1. Q 0
  1. ;
  1. DEL(PATH,F) ; EP-FROM VENPCC2 - DELETE A FILE FROM THE PRINT QUEUE
  1. I $$VEN^VENPCCU=2,$$OS^VENPCCU=1 X ("I $"_"Z"_"F(-1,""rm "_PATH_F_""")") Q ; UNIX/CACHE
  1. I $$VEN^VENPCCU=2 X ("I $"_"Z"_"F(-1,""del "_PATH_F_""")") Q ; NT/CACHE ; PATCHED BY GIS 8/29/03
  1. I $$OS^VENPCCU D UCMD^VENPCCP("rm "_PATH_F) Q ; UNIX/MSM
  1. N PF,X,% ; WINDOWS
  1. S PF=PATH_F
  1. D FUNC^VENPCCP("DEL") ; NT/MSM
  1. Q
  1. ;
  1. TRAP ; EP-PRINT DEAMON ERROR TRAP
  1. S X="ERRQ^VENPCCP1",@^%ZOSF("TRAP") ; SET MUMPS ERROR TRAP AT THIS LEVEL
  1. I $G(ERRSTOP) Q
  1. S ERRSTOP=1
  1. S Z=$$STOP
  1. D CTCP^VENPCCP ; CLOSE THE TCP PORT IF NECESSARY
  1. X ("S %=$"_"ZE")
  1. S ERR="Print Deamon reports MUMPS-level error: "_%,MERR=1
  1. D FILE^VENPCCP2(4,4,ERR) ; DELETES FILE AND MAKES ERROR MESSAGE
  1. Q
  1. ;
  1. ERRQ Q
  1. ;