[623] | 1 | HLCSTCP ;SFIRMFO/TNV-ALB/JFP,PKE - (TCP/IP) MLLP ;09/13/2006
|
---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**19,43,49,57,58,64,84,109,133**;Oct 13, 1995;Build 13
|
---|
| 3 | ;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
| 4 | ;
|
---|
| 5 | ; This is an implementation of the HL7 Minimal Lower Layer Protocol
|
---|
| 6 | ;
|
---|
| 7 | ;taskman entry/startup option, HLDP defined in menu entry,
|
---|
| 8 | Q:'$D(HLDP)
|
---|
| 9 | N HLCSOUT,HLDBACK,HLDBSIZE,HLDREAD,HLDRETR,HLRETRA,HLDWAIT,HLOS,HLTCPADD,HLTCPCS,HLTCPLNK,HLTCPORT,HLTCPRET,HLCSFAIL
|
---|
| 10 | ;HLCSOUT= 1-error
|
---|
| 11 | I '$$INIT D EXITS("Init Error") Q
|
---|
| 12 | ; Start the client
|
---|
| 13 | I $G(HLTCPCS)="C" D Q
|
---|
| 14 | . ; identify process for ^%SY
|
---|
| 15 | . D SETNM^%ZOSV($E("HLClnt:"_HLDP,1,15))
|
---|
| 16 | . D ST1
|
---|
| 17 | . F D ^HLCSTCP2 Q:$$STOP!$G(HLCSOUT)
|
---|
| 18 | . I $G(HLCSOUT)=1 D MON("Error") H 1 Q
|
---|
| 19 | . I $G(HLCSOUT)=2 D EXITS("Inactive") Q
|
---|
| 20 | . D EXITS("Shutdown")
|
---|
| 21 | ;
|
---|
| 22 | ; identify process for ^%SY
|
---|
| 23 | D SETNM^%ZOSV($E("HLSrv:"_HLDP,1,15))
|
---|
| 24 | ;HLCSFAIL=1 port failed to open
|
---|
| 25 | S HLCSFAIL=1
|
---|
| 26 | ;single threaded listener
|
---|
| 27 | I $G(HLTCPCS)="S" D Q
|
---|
| 28 | . D ST1,MON("Listen"),LISTEN^%ZISTCP(HLTCPORT,"SERVER^HLCSTCP("""_HLDP_""")")
|
---|
| 29 | . ;couldn't open listener port
|
---|
| 30 | . I HLCSFAIL D EXITS("Openfail") Q
|
---|
| 31 | ;
|
---|
| 32 | ;multi-threaded listener (OpenM)
|
---|
| 33 | I $G(HLTCPCS)="M",^%ZOSF("OS")["OpenM" D Q
|
---|
| 34 | . D ST1,MON("Listen"),LISTEN^%ZISTCPS(HLTCPORT,"SERVERS^HLCSTCP("""_HLDP_""")")
|
---|
| 35 | Q
|
---|
| 36 | ;
|
---|
| 37 | SERVER(HLDP) ; single server using Taskman
|
---|
| 38 | S HLCSFAIL=0
|
---|
| 39 | I '$$INIT D EXITS("Init error") Q
|
---|
| 40 | D ^HLCSTCP1
|
---|
| 41 | I $$STOP D CLOSE^%ZISTCP,EXITS("Shutdown") S IO("C")="" Q
|
---|
| 42 | Q:$G(HLCSOUT)=1
|
---|
| 43 | D MON("Idle")
|
---|
| 44 | Q
|
---|
| 45 | ;
|
---|
| 46 | SERVERS(HLDP) ; Multi-threaded server using Taskman
|
---|
| 47 | I '$$INIT D EXITS("Init error") Q
|
---|
| 48 | G LISTEN
|
---|
| 49 | ;
|
---|
| 50 | ;multiple process servers, called from an external utility
|
---|
| 51 | MSM ;MSM entry point, called from User-Defined Services
|
---|
| 52 | ;HLDP=ien in the HL LOWER LEVEL PROTOCOL PARAMETER file for the
|
---|
| 53 | ;HL7 Multi-Threaded SERVER
|
---|
| 54 | S (IO,IO(0))=$P
|
---|
| 55 | G LISTEN
|
---|
| 56 | ;
|
---|
| 57 | CACHEVMS(%) ;Cache'/VMS tcpip/ucx entry point, called from HLSEVEN.COM file,
|
---|
| 58 | ;listener, % = HLDP
|
---|
| 59 | I $G(%)="" D ^%ZTER Q
|
---|
| 60 | S IO="SYS$NET",HLDP=%
|
---|
| 61 | S IO(0)="_NLA0:" O IO(0) ;Setup null device
|
---|
| 62 | ; **Cache'/VMS specific code**
|
---|
| 63 | O IO::5 E D MON("Openfail") Q
|
---|
| 64 | X "U IO:(::""-M"")" ;Packet mode like DSM
|
---|
| 65 | D LISTEN C IO Q
|
---|
| 66 | ;
|
---|
| 67 | EN ;vms ucx entry point, called from HLSEVEN.COM file,
|
---|
| 68 | ;listener, % = device^HLDP
|
---|
| 69 | I $G(%)="" D ^%ZTER Q
|
---|
| 70 | S IO="SYS$NET",U="^",HLDP=$P(%,U,2)
|
---|
| 71 | S IO(0)="_NLA0:" O IO(0) ;Setup null device
|
---|
| 72 | ; **VMS specific code, need to share device**
|
---|
| 73 | O IO:(TCPDEV):60 E D MON("Openfail") Q
|
---|
| 74 | LISTEN ;
|
---|
| 75 | N HLLSTN,HLCSOUT,HLDBACK,HLDBSIZE,HLDREAD,HLDRETR,HLRETRA,HLDWAIT,HLOS,HLTCPADD,HLTCPCS,HLTCPLNK,HLTCPORT,HLTCPRET,HLCSFAIL
|
---|
| 76 | I '$$INIT D ^%ZTER Q
|
---|
| 77 | ; identify process for ^%SY
|
---|
| 78 | D SETNM^%ZOSV($E("HLSrv:"_HLDP,1,15))
|
---|
| 79 | ;HLLSTN used to identify a listener to tag MON
|
---|
| 80 | S HLLSTN=1
|
---|
| 81 | ;increment job count, run server
|
---|
| 82 | D UPDT(1),^HLCSTCP1,EXITM
|
---|
| 83 | Q
|
---|
| 84 | ;
|
---|
| 85 | DCOPEN(HLDP) ;open direct connect - called from HLMA2
|
---|
| 86 | Q:'$$INIT 0
|
---|
| 87 | Q:HLTCPADD=""!(HLTCPORT="") 0
|
---|
| 88 | Q:'$$OPEN^HLCSTCP2 0
|
---|
| 89 | Q 1
|
---|
| 90 | ;
|
---|
| 91 | INIT() ; Initialize Variables
|
---|
| 92 | ; HLDP should be set to the IEN or name of Logical Link, file 870
|
---|
| 93 | S HLOS=$P($G(^%ZOSF("OS")),"^")
|
---|
| 94 | N DA,DIQUIET,DR,TMP,X,Y
|
---|
| 95 | S DIQUIET=1
|
---|
| 96 | D DT^DICRW
|
---|
| 97 | I 'HLDP S HLDP=$O(^HLCS(870,"B",HLDP,0)) I 'HLDP Q 0
|
---|
| 98 | S DA=HLDP
|
---|
| 99 | S DR="200.02;200.021;200.022;200.03;200.04;200.05;200.09;400.01;400.02;400.03;400.04;400.05"
|
---|
| 100 | D GETS^DIQ(870,DA,DR,"IN","TMP","TMP")
|
---|
| 101 | ;
|
---|
| 102 | I $D(TMP("DIERR")) QUIT 0
|
---|
| 103 | ; -- re-transmit attempts
|
---|
| 104 | S HLDRETR=+$G(TMP(870,DA_",",200.02,"I"))
|
---|
| 105 | S HLDRETR("CLOSE")=+$G(TMP(870,DA_",",200.022,"I"))
|
---|
| 106 | ; -- exceed re-transmit action
|
---|
| 107 | S HLRETRA=$G(TMP(870,DA_",",200.021,"I"))
|
---|
| 108 | ; -- block size
|
---|
| 109 | S HLDBSIZE=+$G(TMP(870,DA_",",200.03,"I"))
|
---|
| 110 | ; -- read timeout
|
---|
| 111 | S HLDREAD=+$G(TMP(870,DA_",",200.04,"I"))
|
---|
| 112 | ; -- ack timeout
|
---|
| 113 | S HLDBACK=+$G(TMP(870,DA_",",200.05,"I"))
|
---|
| 114 | ; -- uni-directional wait
|
---|
| 115 | S HLDWAIT=$G(TMP(870,DA_",",200.09,"I"))
|
---|
| 116 | ; -- tcp address
|
---|
| 117 | S HLTCPADD=$G(TMP(870,DA_",",400.01,"I"))
|
---|
| 118 | ; -- tcp port
|
---|
| 119 | S HLTCPORT=$G(TMP(870,DA_",",400.02,"I"))
|
---|
| 120 | ; -- tcp/ip service type
|
---|
| 121 | S HLTCPCS=$G(TMP(870,DA_",",400.03,"I"))
|
---|
| 122 | ; -- link persistence
|
---|
| 123 | S HLTCPLNK=$G(TMP(870,DA_",",400.04,"I"))
|
---|
| 124 | ; -- retention
|
---|
| 125 | S HLTCPRET=$G(TMP(870,DA_",",400.05,"I"))
|
---|
| 126 | ;
|
---|
| 127 | ; -- set defaults in case something's not set
|
---|
| 128 | S:HLDREAD=0 HLDREAD=10
|
---|
| 129 | S:HLDBACK=0 HLDBACK=60
|
---|
| 130 | S:HLDBSIZE=0 HLDBSIZE=245
|
---|
| 131 | S:HLDRETR=0 HLDRETR=5
|
---|
| 132 | S:HLTCPRET="" X=$P($$PARAM^HLCS2,U,12),HLTCPRET=$S(X:X,1:15)
|
---|
| 133 | ;
|
---|
| 134 | Q 1
|
---|
| 135 | ;
|
---|
| 136 | ST1 ;record startup in 870 for single server
|
---|
| 137 | ;4=status 9=Time Started, 10=Time Stopped, 11=Task Number
|
---|
| 138 | ;14=Shutdown LLP, 3=LLP Online, 18=Gross Errors
|
---|
| 139 | N HLJ,X
|
---|
| 140 | F L +^HLCS(870,HLDP,0):2 Q:$T
|
---|
| 141 | S X="HLJ(870,"""_HLDP_","")"
|
---|
| 142 | S @X@(4)="Init",(@X@(10),@X@(18))="@",@X@(14)=0
|
---|
| 143 | I HLTCPCS["C" S @X@(3)=$S(HLTCPLNK["Y":"PC",1:"NC")
|
---|
| 144 | E S @X@(3)=$S(HLTCPCS["S":"SS",HLTCPCS["M":"MS",1:"")
|
---|
| 145 | I @X@(3)'="NC" S @X@(9)=$$NOW^XLFDT
|
---|
| 146 | S:$G(ZTSK) @X@(11)=ZTSK
|
---|
| 147 | D FILE^HLDIE("","HLJ","","ST1","HLCSTCP") ;HL*1.6*109
|
---|
| 148 | L -^HLCS(870,HLDP,0)
|
---|
| 149 | Q
|
---|
| 150 | ;
|
---|
| 151 | MON(Y) ;Display current state & check for shutdown
|
---|
| 152 | ;don't display for multiple server
|
---|
| 153 | Q:$G(HLLSTN)
|
---|
| 154 | F L +^HLCS(870,HLDP,0):2 Q:$T
|
---|
| 155 | S $P(^HLCS(870,HLDP,0),U,5)=Y
|
---|
| 156 | L -^HLCS(870,HLDP,0)
|
---|
| 157 | Q:'$D(HLTRACE)
|
---|
| 158 | N X U IO(0)
|
---|
| 159 | W !,"IN State: ",Y
|
---|
| 160 | I '$$STOP D
|
---|
| 161 | . R !,"Type Q to Quit: ",X#1:1
|
---|
| 162 | . I $L(X),"Qq"[X S $P(^HLCS(870,HLDP,0),U,15)=1
|
---|
| 163 | U IO
|
---|
| 164 | Q
|
---|
| 165 | UPDT(Y) ;update job count for multiple servers,X=1 increment
|
---|
| 166 | N HLJ,X
|
---|
| 167 | F L +^HLCS(870,HLDP,0):2 Q:$T
|
---|
| 168 | S X=+$P(^HLCS(870,HLDP,0),U,5),$P(^(0),U,5)=$S(Y:X+1,1:X-1)_" server"
|
---|
| 169 | ;if incrementing, set the Device Type field to Multi-Server
|
---|
| 170 | I X S HLJ(870,HLDP_",",3)="MS" D FILE^HLDIE("","HLJ","","UPDT","HLCSTCP") ;HL*1.6*109
|
---|
| 171 | L -^HLCS(870,HLDP,0)
|
---|
| 172 | Q
|
---|
| 173 | STOP() ;stop flag set
|
---|
| 174 | N X
|
---|
| 175 | F L +^HLCS(870,HLDP,0):2 Q:$T
|
---|
| 176 | S X=+$P(^HLCS(870,HLDP,0),U,15)
|
---|
| 177 | L -^HLCS(870,HLDP,0)
|
---|
| 178 | Q X
|
---|
| 179 | ;
|
---|
| 180 | LLCNT(DP,Y,Z) ;update Logical Link counters
|
---|
| 181 | ;DP=ien of Logical Link in file 870
|
---|
| 182 | ;Y: 1=msg rec, 2=msg proc, 3=msg to send, 4=msg sent
|
---|
| 183 | ;Z: ""=add to counter, 1=subtract from counter
|
---|
| 184 | Q:'$D(^HLCS(870,+$G(DP),0))!('$G(Y))
|
---|
| 185 | N P,X
|
---|
| 186 | S P=$S(Y<3:"IN",1:"OUT")_" QUEUE "_$S(Y#2:"BACK",1:"FRONT")_" POINTER"
|
---|
| 187 | F L +^HLCS(870,DP,P):2 Q:$T
|
---|
| 188 | S X=+$G(^HLCS(870,DP,P)),^(P)=X+$S($G(Z):-1,1:1)
|
---|
| 189 | L -^HLCS(870,DP,P)
|
---|
| 190 | Q
|
---|
| 191 | SDFLD ; set Shutdown? field to yes
|
---|
| 192 | Q:'$G(HLDP)
|
---|
| 193 | N HLJ,X
|
---|
| 194 | F L +^HLCS(870,HLDP,0):2 Q:$T
|
---|
| 195 | ;14=Shutdown LLP?
|
---|
| 196 | S HLJ(870,HLDP_",",14)=1
|
---|
| 197 | D FILE^HLDIE("","HLJ","","SDFLD","HLCSTCP") ;HL*1.6*109
|
---|
| 198 | L -^HLCS(870,HLDP,0)
|
---|
| 199 | Q
|
---|
| 200 | ;
|
---|
| 201 | EXITS(Y) ; Single service shutdown and cleans up
|
---|
| 202 | N HLJ,X
|
---|
| 203 | F L +^HLCS(870,HLDP,0):2 Q:$T
|
---|
| 204 | ;4=status,10=Time Stopped,9=Time Started,11=Task Number
|
---|
| 205 | S X="HLJ(870,"""_HLDP_","")"
|
---|
| 206 | S @X@(4)=Y,@X@(11)="@"
|
---|
| 207 | S:$G(HLCSOUT)'=2 @X@(10)=$$NOW^XLFDT,@X@(9)="@"
|
---|
| 208 | D FILE^HLDIE("","HLJ","","EXITS","HLCSTCP") ; HL*1.6*109
|
---|
| 209 | L -^HLCS(870,HLDP,0)
|
---|
| 210 | I $D(ZTQUEUED) S ZTREQ="@"
|
---|
| 211 | Q
|
---|
| 212 | ;
|
---|
| 213 | EXITM ;Multiple service shutdown and clean up
|
---|
| 214 | D UPDT(0)
|
---|
| 215 | I $D(ZTQUEUED) S ZTREQ="@"
|
---|
| 216 | Q
|
---|