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

VENPCCP.m

Go to the documentation of this file.
  1. VENPCCP ; IHS/OIT/GIS - PRINT DEAMON - MANAGE BACKGROUND PRINTING ; [ 03/03/09 5:46 PM ]
  1. ;;2.6;PCC+;**1,3**;APR 03, 2012;Build 24
  1. ;
  1. ;
  1. ;
  1. TASK ; EP - PRINT DEAMON ; THERE SHOULD ONLY BE 1 PRINT DEAMON PROCESS RUNNING AT A TIME
  1. I $D(^TMP("VEN TASK",$J)) X ("J K"_"T^VENPCCP") Q ; IT LOOKS LIKE THERE ALREADY IS A PRINT DEAMON ALREADY RUNNING IN THIS PARTITION!
  1. E D KILLTASK ; INITIAL CLEANUP ; MAKE SURE NO OTHER PRINT DEAMON PROCESSES ARE RUNNING
  1. D ^VENPCCP1
  1. K ^TMP("VEN TASK",$J) D KILLTASK Q ; FINAL CLEANUP ; STOP ALL PRINT DEAMON PROCESSES
  1. ;
  1. ; ---------------------------------------------------------
  1. ;
  1. SEND(SOCKET,IP,IPA) ; EP - FOR SENDING A RECORD TO THE PRINT SERVICE
  1. ; SEND(SOCKET,IP,IPA,PGIEN,MRPFLAG) ; EP FOR SENDING A RECORD TO THE PRINT SERVICE
  1. ; REC MUST EXIST AS AN ARRAY (VER 2.5) OR A LOCAL VARIABLE (PREVIOUS VERSIONS)
  1. ; IP IS THE TCP/IP ADDRESS. IPA IS THE ALTERNATE IP ADDRESS (IPA IS OPTIONAL)
  1. ; SOCKET IS THE TCP SOCKET NUMBER ON THIS MACHINE
  1. ; REC IS THE RECORD
  1. ; THE RECORD MUST BE '^' DELIMITED. FIRST PIECE: HEADER NAME/MNEMONIC. SECOND PIECE: TEMPLATE NAME/MNEMONIC. THIRD PIECE: PRINTER DESTINATION. FOUTH PIECE: ENVIRONMANTAL INFO OTHER PIECES: DATA
  1. ; THIS FUNCTION RETURNS '1' IF THE TRANSMISSION WAS SUCCESSFUL OR AN ERROR CODE IF IT WAS UNSUCCESSFUL
  1. ; UPDATED TO SUPPERT THE VER 2.5 PRINT SERVICE
  1. ;
  1. CHK I $G(SOCKET),$L(IP),$D(REC)
  1. E D REG^VENPCCP2(10,"MISSING/INVALID CONFIGURATION PARPMETERS") Q 0
  1. N %,N,ACK,ERR,STOP,LEN,PCE,SEX,SSN,VCN,ELIG,RSTG,OK,I
  1. N MAXPCE,CKSUM,TRY,CACHE,BUFF,BLANK,LASTPCE,STOP,ECNT
  1. S ECNT=0 ; INITIALIZE THE ERROR COUNTER
  1. S CACHE=($$VEN^VENPCCU=2),BUFF=$S(CACHE:500,1:500)
  1. I $D(SWAP) S (IP,IPA)=SWAP
  1. JUMP25 I $G(VER25) G EVAR ; VER 2.5: THE REC ARRAY HAS ALREDY BEEN CREATED & CKSUM CALCULATED. NO BLANK LINE NECESSARY.
  1. ADDBLANK S BLANK="",N=$L(REC,U) S $P(BLANK,U,N)="" S BLANK=$C(13,10)_BLANK,CKSUM=$L(REC)+$L(BLANK)
  1. SPLIT F I=1:1 S %=$E(REC,1,BUFF),REC=$E(REC,(BUFF+1),99999) Q:%="" S REC(I)=%,LASTPCE=I+1
  1. F I=LASTPCE:1 S %=$E(BLANK,1,BUFF),BLANK=$E(BLANK,(BUFF+1),99999) Q:%="" S REC(I)=%,MAXPCE=I
  1. EVAR D VAR ; GET ENVIRONMENTAL VARIABLES
  1. TRY S POP=$$OTCP^VENPCCP(IP,SOCKET) ; TRY TO OPEN TCP SOCKET TO THE PRINT SERVER
  1. I POP,$D(SWAP)!(IP=IPA) D REG^VENPCCP2(1,"UNABLE TO ACCESS ANY PRINT SERVERS") Q 0
  1. I POP D REG^VENPCCP2(4,"UNABLE TO ACCESS ONE OF THE PRINT SERVERS ("_IP_")") S (IP,SWAP)=IPA S @TMP="Unable to access one of the Print Servers" G TRY
  1. S TRY=0
  1. START W ("START"_U_CKSUM) W:$G(CACHE) ! K ACK ; START THE TRANSMISSION TO THE PRINT SERVER
  1. R ACK:60
  1. I $G(ACK)=1 G LOOP ; SUCCESSFUL START!
  1. ; IF YOU GET TO THIS POINT, SOMETHING HAS GONE WRONG...
  1. I $G(ACK)=-5 D G:'$D(@TMP) NOTOPEN G:TRY'>20 START Q
  1. . S TRY=TRY+1
  1. . I TRY>20 Q
  1. . H 5
  1. . I '$D(@TMP) Q
  1. . S @TMP="Print Service busy. Will attempt to connect for another "_(100-(5*TRY))_" seconds"
  1. . Q
  1. NOTOPEN D CTCP ; CLOSE TCP SOCKET AFTER START FAILURE
  1. I '$D(@TMP) Q "EXTERNAL HALT"
  1. I $G(ACK)="" D REG^VENPCCP2(1,"Unable to connect to a Print Server") Q 0
  1. I $G(ACK)=-5 D REG^VENPCCP2(2,"Print Service was busy, and it timed out") G N1
  1. D REG^VENPCCP2(2,"Print service reports a startup error ("_$G(ACK)_")")
  1. N1 I $G(SWAP)!(IP=IPA) Q 0 ; FAILED TO START PRINT PROCESS!
  1. S (SWAP,IP)=IPA G TRY
  1. ;
  1. LOOP S PCE=0 K STOP ; DATA TRANSMISSION FROM RPMS TO PCC+ PRINT SVC
  1. S @TMP="Transmitting data to PCC+ print service..."
  1. F S PCE=$O(REC(PCE)) Q:'PCE D I $D(STOP) Q ; TRANSMISSION LOOP: DATA SENT IN CHUNKS.
  1. . S REC=REC(PCE)
  1. . W REC W:CACHE ! K ACK
  1. . R ACK:60 ; TYPICALLY, WE GET SUB-SECOND RESPONSE TIME
  1. . I '$D(ACK) S STOP=0 Q
  1. . I $E(ACK)=1 F Q:$E(ACK,2)'=1 S ACK=$E(ACK,2,99)
  1. . I ACK'=1 S STOP=1
  1. . Q
  1. LOOPFAIL I $D(STOP) D Q 0 ; PRINT SERVICE STARTS RECEPTION, BUT DATA TRANSMISSION FAILS. MANAGE THE ERROR.
  1. . D CTCP
  1. . I 'STOP D REG^VENPCCP2(1,"Print Service starts but then does not respond") Q
  1. . D REG^VENPCCP2(1,"Print Service starts, but then it reports a data transmission failure")
  1. . Q
  1. MERGE S @TMP=(MSG_" Starting mail merge") ; START MAIL MERGE
  1. W "STOP" W:CACHE ! K ACK ; SEND MESSAGE: "STOP" = ALL DATA SENT, START TO GENERATE THE MERGED DOCUMENT
  1. R ACK:60 ; IF THINGS ARE WORKING NORMALLY, THE ACK SHOULD COME BACK WITHIN A FEW SECONDS
  1. CLOSESVS D CTCP ; CLOSE THE TCP CONNECTION
  1. SUCCESS I $G(ACK)=0 S @TMP=(MSG_" Success!!!") Q 1
  1. RETRY I ACK=-1 S ECNT=ECNT+1 I ECNT<2 D G TRY ; PROBABLY A COM PROBLEM. TRY 2 TIMES ; PATCHED BY GIS/OIT 5/15/08 ; PCC+ 2.6 PATCH 1 ; WORK AROUND FOR COM ERROR
  1. . S @TMP=(MSG_" Retry #"_ECNT)
  1. . I $G(IPA)'="",IPA'=IP S IP=IPA ; IF POSSIBLE, TRY A DIFFERENT PRINT SERVER
  1. . H 1
  1. . Q
  1. MERGFAIL D MERGFAIL^VENPCCP2($G(ACK),$G(MRPFLAG),PGIEN) ; MERGE HAS FAILED. MANAGE THE ERROR.
  1. Q 0
  1. ;
  1. VAR ; EP-GET MISC VARS REQUIRED FOR ERROR PROCESSING
  1. ; GET ENVIRONMENTAL VARS: VISIT, DUZ, DUZ(2), DFN, DUZ(0), VENDEV, DEFEF, MRPFLG
  1. I '$G(VER25) D VARS Q
  1. N CNT,STG,X,Y,Z,%,VE,VD,VP
  1. S (VE,VD,VP)=""
  1. S (CNT,CKSUM,MAXPCE)=0
  1. F S CNT=$O(REC(CNT)) Q:'CNT D
  1. . S CKSUM=CKSUM+$L(REC(CNT))
  1. . S MAXPCE=CNT
  1. . S STG=REC(CNT)_$G(REC(CNT+1))
  1. . I 'VE F X="PRINTER","printer" D ; GET ENVIRONMENTAL VARIABLES
  1. .. S Y="^"_X_$C(30)
  1. .. I STG'[Y Q
  1. .. S %=$P(STG,Y,2),%=$P(%,U) ; DATA STRING
  1. .. I $L(%,";")'>5 Q ; INCOMPLETE DATA STRING - WAIT FOR NEXT ITERATION
  1. .. S VISIT=$P(%,";"),DFN=$P(%,";",4),VENDEV=$P(%,U,6),VE=1
  1. .. S %=$C(68,85,90)
  1. .. S @%=$P(%,";",2),@%@(2)=$P(%,";",3),@%@(0)=$P(%,U,5)
  1. .. Q
  1. . I 'VD F X="TEMPLATE","template" D ; GET TEMPLATE
  1. .. S Y="^"_X_$C(30)
  1. .. I STG'[Y Q
  1. .. S %=$P(STG,Y,2) ; DATA STRING
  1. .. I %'[U Q ; INCOMPLETE, WAIT FOR NEXT ITERATION
  1. .. S %=$P(%,U)
  1. .. S DEFEF="",VD=1
  1. .. I '$L(%) Q
  1. .. S Z=0
  1. .. F S Z=$O(^VEN(7.41,Z)) Q:'Z I $P($G(^(Z,0)),U,3)=% S DEFEF=Z Q
  1. .. Q
  1. . I 'VP F X="GROUP","group" D ; GET PRINT GROUP
  1. .. S Y="^"_X_$C(30)
  1. .. I STG'[Y Q
  1. .. S %=$P(STG,Y,2) ; DATA STRING
  1. .. I %'[U Q ; INCOMPLETE, WAIT FOR NEXT ITERATION
  1. .. S %=$P(%,U)
  1. .. S PGIEN="",MRPFLAG=0,VP=1
  1. .. S PGIEN=$O(^VEN(7.4,"B",%,0)) I 'PGIEN Q
  1. .. I $$MRP^VENPCCU=$P($G(^VEN(7.4,PGIEN,0)),U) S MRPFLAG=1
  1. .. Q
  1. . Q
  1. Q
  1. ;
  1. VARS ; EP-OLD WAY OF GETTING ENVIRONMENTAL VARS TO POPULATE ERROR MSG FILE
  1. N %,X,Z
  1. FMVARS S %=$P(REC(1),U,4)
  1. S Z=$C(68,85,90)
  1. S VISIT=$P(%,";"),@Z=$P(%,";",2),@Z@(2)=$P(%,";",3),DFN=$P(%,";",4),@Z@(0)=$P(%,U,5),VENDEV=$P(%,U,6)
  1. DEFEF S %=$P(REC(1),U,2),DEFEF="",Z=0 ; GET DEFAULT TEMPLTE IEN
  1. F S Z=$O(^VEN(7.41,Z)) Q:'Z I $P($G(^(Z,0)),U,3)=% S DEFEF=Z Q
  1. PGIEN S %=$P(REC(1),U,3),PGIEN="",MRPFLAG=0 ; GET PRINT GROUP IEN
  1. I $L(%) S PGIEN=$O(^VEN(7.4,"B",%,0)) ; IDENTIFY PRINT GROUP IEN
  1. MRPFLAG I $$MRP^VENPCCU=$P($G(^VEN(7.4,+$G(PGIEN),0)),U) S MRPFLAG=1 ; THIS DOCUMENT IS GOING TO THE MED REC PRINTER
  1. Q
  1. ;
  1. ; -------------------------------------------------------------
  1. ;
  1. ; GENERIC PRINT DEAMON FUNCTIONS USED BY MANY ROUTINES
  1. ;
  1. OPN(PATH,FILE,RW,EX) ; EP-CLEAN HFS OPEN, USE, EXECUTE, CLOSE
  1. N DEV,POP,TRY,F,CACHE
  1. S F=PATH_FILE,POP=1,TRY=0,CACHE=($$VEN^VENPCCU=2)
  1. OPN1 I 'CACHE X ("F DEV=51:1:54 O DEV:(F:RW):2 I $T S POP=0 U DEV X EX C DEV Q")
  1. I CACHE D Q POP
  1. . S RW=$S(RW="W":"WNS",1:"RS"),DEV=F
  1. . X ("O"_" F:(RW):2")
  1. . X ("I S POP=0 "_"U"_" F X EX "_"C"_" F")
  1. . Q
  1. I 'POP Q 0
  1. ; STOP TRYING IF STOP OPTION HAS BEEN SELECTED
  1. I '$D(^TMP("VEN TASK",$J)) Q 2
  1. S TRY=TRY+1 I TRY>5 Q 1
  1. H 2 G OPN1
  1. ;
  1. FIRST(PATH) ; EP-FIRST FILE IN THE PATH
  1. I $$VEN^VENPCCU=2 X ("S RESULT=$"_"Z"_"SEARCH("""_PATH_"*.TXT"")") Q $P(RESULT,"\",$L(RESULT,"\"))
  1. I $$OS^VENPCCU S RESULT=$$UNIX(PATH,"S RESULT="""" F R % Q:%="""" I %["".TXT""!(%["".txt"") S RESULT=% Q") Q RESULT
  1. N X,PF
  1. S PF=PATH_"*.TXT"
  1. D FUNC("FIRST")
  1. Q $P(X,U)
  1. ;
  1. DEL(PATH,F) ; EP-FROM VENPCC2A - 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
  1. I $$OS^VENPCCU D UCMD("rm "_PATH_F) Q ; UNIX/MSM
  1. N PF,X,%
  1. S PF=PATH_F
  1. D FUNC("DEL") ; NT/MSM
  1. Q
  1. ;
  1. COUNT(PATH) ; EP-COUNT FILES WAITING TO BE PROCESSED
  1. N FILE,CNT
  1. I $$VEN^VENPCCU=2 X ("F CNT=0:1 S FILE=$S('CNT:(PATH_""*.TXT""),1:"""") S FILE=$"_"Z"_"SEARCH(FILE) I '$L(FILE) Q") Q CNT
  1. I $$OS^VENPCCU N RESULT,X S RESULT=$$UNIX(PATH,"S RESULT=0 F R X Q:'$L(X) I X["".TXT""!(X["".txt"") S RESULT=RESULT+1") Q RESULT
  1. N PF,CNT
  1. S PF=PATH_"*.TXT"
  1. D FUNC("FIRST")
  1. I '$L(X) Q 0
  1. S CNT=1
  1. COUNT1 D FUNC("NEXT")
  1. I X="" Q CNT
  1. S CNT=CNT+1
  1. G COUNT1
  1. ;
  1. FIND(PATH,TARGET) ;EP-RETURN A '1' IF A FILE EXISTS
  1. N FILE
  1. I $$VEN^VENPCCU=2 X ("S TARGET=$"_"Z"_"SEARCH(PATH_TARGET)") Q ($L(TARGET)>0)
  1. I $$OS^VENPCCU N RESULT,X S RESULT=$$UNIX(PATH,"S RESULT=0 F R X Q:'$L(X) I $P(X,U)=TARGET S RESULT=1 Q") Q RESULT
  1. N PF
  1. S PF=PATH_TARGET
  1. D FUNC("FIRST")
  1. I '$L(X) Q 0
  1. I $P(X,U)=TARGET Q 1
  1. FIND1 X "S X=$"_"Z"_"OS(13,X)"
  1. I X="" Q 0
  1. I $P(X,U)=TARGET Q 1
  1. G FIND1
  1. ;
  1. UCMD(CMD) ;EP-UNIX COMMANDS
  1. Q:'$L($G(CMD))
  1. X ("I $$JOB"_"WAIT"_U_"%HOST"_"CMD(CMD)")
  1. Q
  1. ;
  1. UNIX(PATH,EX) ; EP-EXAMINE A UNIX DIRECTORY
  1. N PATH2,PATHX,FILE,CMD,RESULT
  1. S PATH2=$G(^VEN(7.5,CFIGIEN,3)),PATHX=$E(PATH,1,$L(PATH)-1),RESULT=""
  1. S FILE="ven_"_+$J_".temp",CMD="ls "_PATHX_" > "_PATH2_FILE
  1. D UCMD(CMD)
  1. S POP=$$OPN(PATH2,FILE,"R",EX) I POP Q ""
  1. D DEL(PATH2,FILE)
  1. Q RESULT
  1. ;
  1. OTCP(IP,SOCKET) ; EP-OPEN TCP
  1. N IO,IOF,IOT,IOST,POP
  1. I $$VEN^VENPCCU<2 D CALL^%ZISTCP(IP,SOCKET,10) Q POP
  1. S POP=1 X ("O"_" ""|TCP|"_SOCKET_""":"""_IP_""":5") I $T S POP=0 X ("U"_" ""|TCP|"_SOCKET_"""")
  1. Q POP
  1. ;
  1. CTCP ; EP-CLOSE TCP
  1. I $$VEN^VENPCCU<2 X ("C"_" 56") Q
  1. I '$G(SOCKET) N SOCKET S SOCKET=$P($G(^VEN(7.5,$$CFG^VENPCCU,11)),U,3)
  1. X ("C"_" ""|TCP|"_SOCKET_"""")
  1. Q
  1. ;
  1. FUNC(ACT) ; EP-MSM/NT FUNCTIONS
  1. N %,Y
  1. S %="S X=$"_"Z"_"O"
  1. I ACT="FIRST" X (%_"S(12,PF,0)") Q
  1. I ACT="NEXT" X (%_"S(13,X)") Q
  1. I ACT="DEL",PF'["*." X (%_"S(2,PF)") Q
  1. I ACT'="DEL" Q
  1. D FUNC("FIRST") I X="" Q
  1. I X[".txt"!(X[".TXT") S Y=X,PF=PATH_$P(X,U) D FUNC("DEL") S X=Y
  1. F D FUNC("NEXT") Q:X="" I X[".txt"!(X[".TXT") S Y=X,PF=PATH_$P(X,U) D FUNC("DEL") S X=Y
  1. Q
  1. ;
  1. HOLD(FILE,PATH) ; EP-IF TRANSMISSION FAILS, PUT THE FILE SET AT THE BACK OF THE LINE
  1. N X,N,M,%,F,R,CMD,STG,%
  1. S N=$E(FILE,2,99)
  1. F M="e","g","h","E","G","H" S F=(M_N) I $$FIND(PATH,F) D
  1. . S R="z"_$E(F)_$E(F,3,99),STG=" "_PATH_F_" "_PATH_R
  1. . I $$VEN^VENPCCU=2 S CMD="copy"_STG X ("S %=$"_"Z"_"F(-1,CMD)") D DEL(PATH,F) Q
  1. . I $$OS^VENPCCU S CMD="cp"_STG D UCMD(CMD) D DEL(PATH,F) Q
  1. . X ("S %=$"_"ZO"_"S(3,PATH_F,PATH_R)")
  1. . Q
  1. Q
  1. ;
  1. KT H 3
  1. KILLTASK ; EP - DEFINITIVE WAY TO STOP ALL INSTANCES OF THE PRINT DEAMON
  1. N X
  1. S X=0
  1. F S X=$O(^TMP("VEN TASK",X)) Q:'X D ; MAKE SURE ALL PRINT DEAMON PROCESSES ARE SHUT DOWN
  1. . K ^TMP("VEN TASK",X) ; INDIRECT WAY TO STOP ANOTHER PROCESS ; MSM
  1. . I $P($G(^VEN(7.5,$$CFG^VENPCCU,0)),"^",5)=2 X ("S %=$Z"_"UTIL(4,X)") Q ; DIRECTLY STOP ANOTHER PRINT DEAMON PROCESS; CACHE ONLY
  1. . Q
  1. Q
  1. ;