| 1 | HLCSTCP4 ;SFIRMFO/RSD - BI-DIRECTIONAL TCP ;10/18/2007  09:56
 | 
|---|
| 2 |  ;;1.6;HEALTH LEVEL SEVEN;**109,122**;Oct 13,1995;Build 14
 | 
|---|
| 3 |  ;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  Q
 | 
|---|
| 6 |  ; RDERR & ERROR moved from HLCSTCP2 on 12/2/2003 - LJA
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 | RDERR ; Error during read process, decrement counter
 | 
|---|
| 9 |  D LLCNT^HLCSTCP(HLDP,4,1)
 | 
|---|
| 10 | ERROR ; Error trap
 | 
|---|
| 11 |  ; OPEN ERROR-retry.
 | 
|---|
| 12 |  ; WRITE ERROR (SERVER DISCONNECT)-close channel, retry
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  ;**109**
 | 
|---|
| 15 |  ;I $G(HLMSG) L -^HLMA(HLMSG)
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  ; patch HL*1.6*122 start
 | 
|---|
| 18 |  N STOP
 | 
|---|
| 19 |  S STOP=0
 | 
|---|
| 20 |  I $G(HLDP) S STOP=$$STOP^HLCSTCP
 | 
|---|
| 21 |  S $ETRAP="D UNWIND^%ZTER"
 | 
|---|
| 22 |  S HLTCP("$ZA\8192#2")=""
 | 
|---|
| 23 |  I (^%ZOSF("OS")["OpenM") D
 | 
|---|
| 24 |  . S HLTCP("$ZA")=$ZA
 | 
|---|
| 25 |  . ; For TCP devices $ZA\8192#2: the device is currently in the
 | 
|---|
| 26 |  . ; Connected state talking to a remote host.
 | 
|---|
| 27 |  . S HLTCP("$ZA\8192#2")=$ZA\8192#2
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  S HLTCPERR("ERR-$ZE")=$$EC^%ZOSV
 | 
|---|
| 30 |  ; I $$EC^%ZOSV["OPENERR"!($$EC^%ZOSV["NOTOPEN")!($$EC^%ZOSV["DEVNOTOPN") D CC^HLCSTCP2("Op-err") S:$G(HLPRIO)="I" HLERROR="15^Open Related Error" D UNWIND^%ZTER Q
 | 
|---|
| 31 |  I $$EC^%ZOSV["OPENERR"!($$EC^%ZOSV["NOTOPEN")!($$EC^%ZOSV["DEVNOTOPN") D  G:STOP H2^XUSCLEAN Q
 | 
|---|
| 32 |  . D CC^HLCSTCP2("Op-err") H 1
 | 
|---|
| 33 |  . S:$G(HLPRIO)="I" HLERROR="15^Open Related Error"
 | 
|---|
| 34 |  . I STOP D  Q
 | 
|---|
| 35 |  .. D CC^HLCSTCP2("Shutdown: (with 'Op-err')")
 | 
|---|
| 36 |  . I 'STOP D UNWIND^%ZTER
 | 
|---|
| 37 |  I $$EC^%ZOSV["WRITE" D  G:STOP!(HLTCP("$ZA\8192#2")=0) H2^XUSCLEAN Q
 | 
|---|
| 38 |  . D CC^HLCSTCP2("Wr-err") H 1
 | 
|---|
| 39 |  . S:$G(HLPRIO)="I" HLERROR="108^Write Error"
 | 
|---|
| 40 |  . I STOP D  Q
 | 
|---|
| 41 |  .. D CC^HLCSTCP2("Shutdown: (with 'Wr-err')")
 | 
|---|
| 42 |  . I HLTCP("$ZA\8192#2")=0 D  Q
 | 
|---|
| 43 |  .. D CC^HLCSTCP2("Halt (Wr): (Disconnected with 'Wr-err')")
 | 
|---|
| 44 |  . I 'STOP,HLTCP("$ZA\8192#2") D UNWIND^%ZTER
 | 
|---|
| 45 |  ; I $$EC^%ZOSV["READ" D CC^HLCSTCP2("Rd-err") S:$G(HLPRIO)="I" HLERROR="108^Read Error" D UNWIND^%ZTER Q
 | 
|---|
| 46 |  I $$EC^%ZOSV["READ" D  G:STOP!(HLTCP("$ZA\8192#2")=0) H2^XUSCLEAN Q
 | 
|---|
| 47 |  . D CC^HLCSTCP2("Rd-err") H 1
 | 
|---|
| 48 |  . S:$G(HLPRIO)="I" HLERROR="108^Read Error"
 | 
|---|
| 49 |  . I STOP D  Q
 | 
|---|
| 50 |  .. D CC^HLCSTCP2("Shutdown: (with 'Rd-err')")
 | 
|---|
| 51 |  . I HLTCP("$ZA\8192#2")=0 D  Q
 | 
|---|
| 52 |  .. D CC^HLCSTCP2("Halt (Rd): (Disconnected with 'Rd-err')")
 | 
|---|
| 53 |  . I 'STOP,HLTCP("$ZA\8192#2") D UNWIND^%ZTER
 | 
|---|
| 54 |  S HLCSOUT=1 D ^%ZTER,CC^HLCSTCP2("Error"),SDFLD^HLCSTCP
 | 
|---|
| 55 |  S:$G(HLPRIO)="I" HLERROR="9^Error"
 | 
|---|
| 56 |  I STOP D CC^HLCSTCP2("Shutdown: (with 'Error')")
 | 
|---|
| 57 |  I HLTCP("$ZA\8192#2")=0 D
 | 
|---|
| 58 |  . D CC^HLCSTCP2("Halt (Er): (Disconnected with 'Error')")
 | 
|---|
| 59 |  G:STOP!(HLTCP("$ZA\8192#2")=0) H2^XUSCLEAN
 | 
|---|
| 60 |  ; patch HL*1.6*122 end
 | 
|---|
| 61 |  D UNWIND^%ZTER
 | 
|---|
| 62 |  Q
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 | PROXY ; set DUZ for application proxy user
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 |  ; removed the execcution: patch 122 TEST v2
 | 
|---|
| 67 |  Q
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ;; S HLDUZ=+$$APFIND^XUSAP("HLSEVEN,APPLICATION PROXY")
 | 
|---|
| 70 |  ;; S DUZ=HLDUZ
 | 
|---|
| 71 |  ;; D DUZ^XUP(DUZ)
 | 
|---|
| 72 |  ;; Q
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | HLDUZ ; compare DUZ and set DUZ to application proxy user
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 |  ; removed the execcution: patch 122 TEST v2
 | 
|---|
| 77 |  Q
 | 
|---|
| 78 |  ;
 | 
|---|
| 79 |  ;; I '$G(HLDUZ) D PROXY
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 | HLDUZ2 ; compare DUZ and HLDUZ
 | 
|---|
| 82 |  I $G(DUZ)'=HLDUZ D
 | 
|---|
| 83 |  . S DUZ=HLDUZ
 | 
|---|
| 84 |  . D DUZ^XUP(DUZ)
 | 
|---|
| 85 |  Q
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 | CLEANVAR ; clean variables for server, called from HLCSTCP1
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  ; clean variables except Kernel related variables
 | 
|---|
| 90 |  ; protect variables defined in HLCSTCP
 | 
|---|
| 91 |  N HLDP
 | 
|---|
| 92 |  N HLCSOUT,HLDBACK,HLDBSIZE,HLDREAD,HLDRETR,HLRETRA,HLDWAIT,HLOS
 | 
|---|
| 93 |  N HLTCPADD,HLTCPCS,HLTCPLNK,HLTCPORT,HLTCPRET,HLCSFAIL,HLZRULE
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  ; protect variables defined in LISTEN^HLCSTCP
 | 
|---|
| 96 |  ; N HLLSTN,HLCSOUT,HLDBACK,HLDBSIZE,HLDREAD,HLDRETR,HLRETRA,HLDWAIT
 | 
|---|
| 97 |  ; N HLOS,HLTCPADD,HLTCPCS,HLTCPLNK,HLTCPORT,HLTCPRET,HLCSFAIL
 | 
|---|
| 98 |  N HLLSTN
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 |  ; protect variables defined in CACHEVMS^HLCSTCP and EN^HLCSTCP
 | 
|---|
| 101 |  N %
 | 
|---|
| 102 |  ; protect variables defined in this routine HLCSTCP1
 | 
|---|
| 103 |  N $ETRAP,$ESTACK
 | 
|---|
| 104 |  N HLMIEN,HLASTMSG
 | 
|---|
| 105 |  N HLTMBUF
 | 
|---|
| 106 |  N HLDUZ,DUZ
 | 
|---|
| 107 |  ; Kernel variables for single listener
 | 
|---|
| 108 |  N ZISOS,ZRULE
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  D KILL^XUSCLEAN
 | 
|---|
| 111 |  Q
 | 
|---|
| 112 | MIEN ; sets HLIND1=ien in 773^ien in 772 for message
 | 
|---|
| 113 |  N HLMID,X
 | 
|---|
| 114 |  I HLIND1 D
 | 
|---|
| 115 |  . S:'$G(^HLMA(+HLIND1,0)) HLIND1=0
 | 
|---|
| 116 |  . S:'$G(^HL(772,+$P(HLIND1,U,2),0)) HLIND1=0
 | 
|---|
| 117 |  ;msg. id is 10th of MSH & 11th for BSH or FSH
 | 
|---|
| 118 |  S X=10+($E(HLMSG(1,0),1,3)'="MSH"),HLMID=$$PMSH(.HLMSG,X)
 | 
|---|
| 119 |  ;if HLIND1 is set, kill old message, use HLIND1 for new
 | 
|---|
| 120 |  ;message, it means we never got end block for 1st msg.
 | 
|---|
| 121 |  I HLIND1 D  Q
 | 
|---|
| 122 |  . ;get pointer to 772, kill header
 | 
|---|
| 123 |  . ;
 | 
|---|
| 124 |  . ; patch HL*1.6*122: MPI-client/server
 | 
|---|
| 125 |  . F  L +^HLMA(+HLIND1):10 Q:$T  H 1
 | 
|---|
| 126 |  . K ^HLMA(+HLIND1,"MSH")
 | 
|---|
| 127 |  . L -^HLMA(+HLIND1)
 | 
|---|
| 128 |  . ;
 | 
|---|
| 129 |  . I $D(^HL(772,+$P(HLIND1,U,2),"IN")) K ^("IN")
 | 
|---|
| 130 |  . S X=$$MAID^HLTF(+HLIND1,HLMID)
 | 
|---|
| 131 |  . D SAVE^HLCSTCP1(.HLMSG,"^HLMA("_+HLIND1_",""MSH"")")
 | 
|---|
| 132 |  . S:$P(HLIND1,U,3) $P(HLIND1,U,3)=""
 | 
|---|
| 133 |  D TCP^HLTF(.HLMID,.X,.HLDT)
 | 
|---|
| 134 |  S HLBUFF("IEN773")=X
 | 
|---|
| 135 |  I 'X D  Q
 | 
|---|
| 136 |  . ;error - record and reset array
 | 
|---|
| 137 |  . ;killing HLLSTN will allow MON^HLCSTCP to work with multi-server
 | 
|---|
| 138 |  . D CLEAN^HLCSTCP1 K HLLSTN
 | 
|---|
| 139 |  . ;error 100=LLP Could not Enqueue the Message, reset array
 | 
|---|
| 140 |  . D MONITOR^HLCSDR2(100,19,HLDP),MON^HLCSTCP("ERROR") H 30
 | 
|---|
| 141 |  ;HLIND1=ien in 773^ien in 772
 | 
|---|
| 142 |  S HLIND1=X_U_+$G(^HLMA(X,0))
 | 
|---|
| 143 |  S HLBUFF("HLIND1")=HLIND1
 | 
|---|
| 144 |  ;save MSH into 773
 | 
|---|
| 145 |  D SAVE^HLCSTCP1(.HLMSG,"^HLMA("_+HLIND1_",""MSH"")")
 | 
|---|
| 146 |  Q
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 | PMSH(MSH,P) ;get piece P from MSH array (passed by ref.)
 | 
|---|
| 149 |  N FS,I,L,L1,L2,X,Y
 | 
|---|
| 150 |  S FS=$E(MSH(1,0),4),(L2,Y)=0,X=""
 | 
|---|
| 151 |  F I=1:1 S L1=$L($G(MSH(I,0)),FS),L=L1+Y-1 D  Q:$L(X)!'$D(MSH(I,0))
 | 
|---|
| 152 |  . S:L1=1 L=L+1
 | 
|---|
| 153 |  . S:P'>L X=$P($G(MSH(I-1,0)),FS,P-L2)_$P($G(MSH(I,0)),FS,(P-Y))
 | 
|---|
| 154 |  . S L2=Y,Y=L
 | 
|---|
| 155 |  Q X
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 | ERROR1 ;
 | 
|---|
| 158 |  ; moved from ERROR^HLCSTCP1
 | 
|---|
| 159 |  ; Error trap for disconnect error and return back to the read loop.
 | 
|---|
| 160 |  ; patch HL*1.6*122 start
 | 
|---|
| 161 |  I (^%ZOSF("OS")["OpenM") D
 | 
|---|
| 162 |  . S HLTCP("$ZA")=$ZA
 | 
|---|
| 163 |  . ; For TCP devices $ZA\8192#2: the device is currently in the
 | 
|---|
| 164 |  . ; Connected state talking to a remote host.
 | 
|---|
| 165 |  . S HLTCP("$ZA\8192#2")=$ZA\8192#2
 | 
|---|
| 166 |  . I HLTCP("$ZA\8192#2")=0 D
 | 
|---|
| 167 |  .. ; decrement counter of multi-listener
 | 
|---|
| 168 |  .. I $D(^HLCS(870,"E","M",+$G(HLDP))) D EXITM^HLCSTCP
 | 
|---|
| 169 |  .. ; process terminated
 | 
|---|
| 170 |  .. D H2^XUSCLEAN
 | 
|---|
| 171 |  S $ETRAP="D UNWIND^%ZTER"
 | 
|---|
| 172 |  ; I $$EC^%ZOSV["READ"!($$EC^%ZOSV["NOTOPEN")!($$EC^%ZOSV["DEVNOTOPN") D UNWIND^%ZTER Q
 | 
|---|
| 173 |  I ($$EC^%ZOSV["NOTOPEN")!($$EC^%ZOSV["DEVNOTOPN") D  Q
 | 
|---|
| 174 |  . ; if it is not a multi-listener
 | 
|---|
| 175 |  . I '$D(^HLCS(870,"E","M",+$G(HLDP))) D CC^HLCSTCP1("Open-err")
 | 
|---|
| 176 |  . D UNWIND^%ZTER
 | 
|---|
| 177 |  I $$EC^%ZOSV["READ" D  Q
 | 
|---|
| 178 |  . ; if it is not a multi-listener
 | 
|---|
| 179 |  . I '$D(^HLCS(870,"E","M",+$G(HLDP))) D CC^HLCSTCP1("Rd-err")
 | 
|---|
| 180 |  . D UNWIND^%ZTER
 | 
|---|
| 181 |  ;
 | 
|---|
| 182 |  ; I $$EC^%ZOSV["WRITE" D CC("Wr-err") D UNWIND^%ZTER Q
 | 
|---|
| 183 |  I $$EC^%ZOSV["WRITE" D  Q
 | 
|---|
| 184 |  . ; if it is not a multi-listener
 | 
|---|
| 185 |  . I '$D(^HLCS(870,"E","M",+$G(HLDP))) D CC^HLCSTCP1("Wr-err")
 | 
|---|
| 186 |  . D UNWIND^%ZTER
 | 
|---|
| 187 |  ;
 | 
|---|
| 188 |  ; for GT.M
 | 
|---|
| 189 |  I $ECODE["UREAD" D  Q
 | 
|---|
| 190 |  . ; if it is not a multi-listener
 | 
|---|
| 191 |  . I '$D(^HLCS(870,"E","M",+$G(HLDP))) D CC^HLCSTCP1("Rd-err")
 | 
|---|
| 192 |  . D UNWIND^%ZTER
 | 
|---|
| 193 |  ;
 | 
|---|
| 194 |  ; S HLCSOUT=1 D ^%ZTER,CC("Error")
 | 
|---|
| 195 |  S HLCSOUT=1
 | 
|---|
| 196 |  D ^%ZTER
 | 
|---|
| 197 |  ; if it is not a multi-listener
 | 
|---|
| 198 |  I '$D(^HLCS(870,"E","M",+$G(HLDP))) D CC^HLCSTCP1("Error")
 | 
|---|
| 199 |  ; patch HL*1.6*122 end
 | 
|---|
| 200 |  ;
 | 
|---|
| 201 |  D UNWIND^%ZTER
 | 
|---|
| 202 |  Q
 | 
|---|
| 203 |  ;
 | 
|---|
| 204 | CLRMCNTR ;
 | 
|---|
| 205 |  ; clear the counter to set as "0 server" for multi-listener
 | 
|---|
| 206 |  ; HL*1.6*122 start
 | 
|---|
| 207 |  Q:'$G(HLDP)
 | 
|---|
| 208 |  Q:'$D(^HLCS(870,"E","M",HLDP))
 | 
|---|
| 209 |  S $P(^HLCS(870,HLDP,0),"^",4)="MS"
 | 
|---|
| 210 |  S $P(^HLCS(870,HLDP,0),U,5)="0 server"
 | 
|---|
| 211 |  Q
 | 
|---|
| 212 |  ;
 | 
|---|
| 213 | CREATUSR ;
 | 
|---|
| 214 |  ; patch HL*1.6*122 TEST v2: DUZ code removed
 | 
|---|
| 215 |  ; create application proxy users for listeners and incoming filer
 | 
|---|
| 216 |  ;; N HLTEMP
 | 
|---|
| 217 |  ;; S HLTEMP=$$CREATE^XUSAP("HLSEVEN,APPLICATION PROXY","#")
 | 
|---|
| 218 |  Q
 | 
|---|