HLTP3 ;SFIRMFO/RSD - Transaction Processor for TCP ;07/29/2009  14:51
 ;;1.6;HEALTH LEVEL SEVEN;**19,43,57,58,59,66,69,109,115,108,116,117,125,120,133,122,140,142,145**;Oct 13, 1995;Build 4
 ;Per VHA Directive 2004-038, this routine should not be modified.
 ;
 Q
NEW(X) ;process new msg. ien in 773^ien in 772
 ;HLMTIENS=ien in #773; HLMTIEN=ien in #772
 ;HLHDRO=original header;  HLHDR=response header
 ;set error trap
 N $ETRAP,$ESTACK S $ETRAP="D ERROR^HLTP3"
 N HL,HLEID,HLEIDS,HLERR,HLHDR,HLHDRO,HLMTIEN,HLMTIENS,HLJ,HLMSA,HLQUIT,HLNODE,HLNEXT,HLRESLTA,HLDONE1,HLASTRSP,HLRESLT
 S HLRESLT=""
 D INIT^HLTP3A
 ;error with header, return commit/app reject
 I $G(HLRESLT) D  Q
 . ;set status & unlock record
 . D STATUS^HLTF0(HLMTIENS,4,,,1),EXIT
 . ;quit if no commit or app ack
 . I $G(HL("ACAT"))="NE",$G(HL("APAT"))="NE" Q
 . S X=$S($G(HL("ACAT"))="AL":"CR",1:"AR")
 . ;HLTCP=ien of acknowledgment msg. from ACK^HLTP4
 . D ACK^HLTP4(X,$P(HLRESLT,U,2)) Q:'$G(HLTCP)
 . ;write ack back
 . S X=$$WRITE^HLCSTCP2(HLTCP)
 . ;update counter to sent
 . D LLCNT^HLCSTCP(HLDP,4)
 . ;update status of ack
 . D STATUS^HLTF0(HLTCP,3,,,1)
 ;
 ;check for duplicate msg., use rec. app and msg. id x-ref
 ; patch HL*1.6*142 start
 ; HL("HDR FLDS:3-6") extracted from field 3 to field 6 of header
 ; defined in HLDIE routine
 ; I $G(HL("MID"))]"",$G(HL("RAP")) S X=$O(^HLMA("AH",HL("RAP"),HL("MID"),0)) D  Q:'$D(HLMTIENS)
 I ($G(HL("MID"))]""),($G(HL("HDR FLDS:3-6"))]"") D  Q:'$D(HLMTIENS)
 . S X=$O(^HLMA("AH-NEW",HL("HDR FLDS:3-6"),HL("MID"),0))
 . ; patch HL*1.6*142 end
 . ;HLASTMSG=last ien received during this connection
 . ;if no duplicate, save msg. ien and quit
 . I X=HLMTIENS!'X S HLASTMSG=HLMTIENS Q
 . N MSH,OIENS
 . S (OIENS,Y)=X D  S Y=HLMTIENS D
 .. ;combine MSH into single string
 .. S MSH(Y)="",I=0 F  S I=$O(^HLMA(Y,"MSH",I)) Q:'I  S MSH(Y)=MSH(Y)_$G(^(I,0))
 .; patch 117 & 125, check if identical
 .I MSH(HLMTIENS)'=MSH(OIENS) S HLASTMSG=HLMTIENS Q
 .;
 . ;msg is duplicate, set status
 . D STATUS^HLTF0(HLMTIENS,4,109,"Duplicate with ien "_OIENS,1),EXIT
 . ;msg was resent, ignore it.
 . I HLASTMSG=HLMTIENS K HLMTIENS Q
 . ;find original response and send back
 . S HLASTRSP=$O(^HLMA("AF",OIENS,OIENS))
 . ; patch HL*1.6*142 start
 . ; the original msg may need to be updated again if 1st time
 . ; update failed
 . S HLASTMSG("OIENS")=OIENS
 . ;
 . ; the original message and its commit ACK were purged, OIENS is
 . ; duplicate and needs to create its own commit ACK (happened
 . ; between MPI and VIE in 9/2008), the OIENS will be processed
 . ; by the application routine again.
 . I $G(HL("ACAT"))="AL",'$G(HL("ACK")),'HLASTRSP D
 .. N HLTCP,HLMTIENS
 .. S HLMTIENS=OIENS
 .. D ACK^HLTP4("CA")
 .. D LLCNT^HLCSTCP(HLDP,3,1) ; decreament and will be added later
 .. S HLASTRSP=HLTCP
 . ; patch HL*1.6*142 end
 ;
 ; patch HL*1.6*145 start
 ; Quit if this is application ack to application ack
 I $G(HL("ACK")) D  Q
 . N HLERRMG,X
 . S HLERRMG="Received application acknowledgement to an application acknowledgement"
 . ;msg is a resend, HLASTRSP=ien of original response (commit ACK)
 . I $G(HLASTRSP) D
 .. S HLTCP=HLASTRSP
 .. D STATUS^HLTF0(HLTCP,8)
 .. S ^HLMA(+HLTCP,"S")=$$NOW^XLFDT
 .. D LLCNT^HLCSTCP(HLDP,3)
 . E  D  Q:'$G(HLTCP)
 .. ;Send CR and update status of original and current ack messages
 .. D ACK^HLTP4("CR",HLERRMG)
 . ;
 . ; write commit ACK (original commit ACK)
 . S X=$$WRITE^HLCSTCP2(HLTCP)
 . D STATUS^HLTF0(HLTCP,3,,"'Reject' commit ACK: "_HLERRMG,1)
 . S ^HLMA(+HLTCP,"S")=$$NOW^XLFDT
 . D LLCNT^HLCSTCP(HLDP,4)
 . S HLTCP=""
 . ; D STATUS^HLTF0(HL("MTIENS"),3,,,1),STATUS^HLTF0(HLMTIENS,3,,,1)
 . D STATUS^HLTF0(HL("MTIENS"),3,,,1)
 . D STATUS^HLTF0(HLMTIENS,4,,HLERRMG,1)
 . ;unlock record
 . D EXIT
 ; patch HL*1.6*145 end
 ;
 ; enhance ack., send commit, quit if not an ack, msg will be 
 ; processed by filer
 I $G(HL("ACAT"))="AL" D  Q:'$G(HL("MTIENS"))
 . ;msg is a resend, HLASTRSP=ien of original response (commit ACK)
 .I $G(HLASTRSP) D
 ..S HLTCP=HLASTRSP
 ..D LLCNT^HLCSTCP(HLDP,3)
 . E  D  Q:'$G(HLTCP)
 ..D ACK^HLTP4("CA") ;**109** LLCNT^HLCSTCP(HLDP,3) called in ACK^HLTP4
 . ;
 . ; write commit ACK (original commit ACK)
 . S X=$$WRITE^HLCSTCP2(HLTCP)
 . ; patch HL*1.6*142
 . ; D LLCNT^HLCSTCP(HLDP,4),STATUS^HLTF0(HLTCP,3,,,1):'$G(HLASTRSP)
 . D LLCNT^HLCSTCP(HLDP,4)
 . I '$G(HLASTRSP) D
 .. D STATUS^HLTF0(HLTCP,3,,,1)
 . S HLTCP=""
 . ;if not an ack, set status to awaiting processing **109** and put on in queue
 . I '$G(HL("MTIENS")),'$G(HLASTRSP) D STATUS^HLTF0(HLMTIENS,9),EXIT,SETINQUE^HLTP31
 . ;
 . ; patch HL*1.6*142 start
 . ;if the original msg failed to en-queue and update status
 . ; it may happen when COTS disconnect the listener during
 . ; writing the commit ACK
 . ; deal with a non-application ACK duplicate message
 . I '$G(HL("MTIENS")),$G(HLASTRSP) D
 .. N STATUS
 .. S STATUS=+$G(^HLMA(HLASTRSP,"P"))
 .. I STATUS,(STATUS'=3) D
 ... ; update the original messsage, ien=HLASTMSG("OIENS")
 ... D STATUS^HLTF0(HLASTMSG("OIENS"),9)
 ... D EXIT
 ... N HLMTIENS
 ... S HLMTIENS=HLASTMSG("OIENS")
 ... D SETINQUE^HLTP31
 ... D STATUS^HLTF0(HLASTRSP,3,,,1)
 . ; patch HL*1.6*142 end
 ;
 ;enhance ack., no commit & no app ack
 I $G(HL("ACAT"))="NE",$G(HL("APAT"))="NE" D  Q
 . ;set status to awaiting processing, **109** and put on in queue
 . I '$G(HLASTRSP) D STATUS^HLTF0(HLMTIENS,9),EXIT,SETINQUE^HLTP31
 ;
 ; patch HL*1.6*120 start
 ;resending old response, msg is a resend
 ; do not re-send duplicate when $G(HL("ACAT"))="AL"
 ; the following resend is for original mode application ACK
 I $G(HLASTRSP),$G(HL("ACAT"))'="AL" S HLTCP=HLASTRSP G ACK
 ; patch HL*1.6*120 end
 ;
 ; patch HL*1.6*142 start
 ; to handle duplicate when the original message encountered
 ; a write error of commit ACK
 ; quit if duplicate
 ; Q:$G(HLASTRSP)
 S HLASTRSP("FLAG")=0
 I $G(HLASTRSP),$G(HL("ACAT"))="AL" D
 . I +$G(^HLMA(+$G(HLASTRSP),"P")),(+$P($G(^HLMA(+$G(HLASTRSP),"P")),"^")'=3) D
 .. S HLASTRSP("FLAG")=1
 ; don't quit if this is duplicate application ACK msg with accept
 ; ACK type="AL", and its original commit ACK is not done.
 I $G(HLASTRSP),('HLASTRSP("FLAG")) Q
 ;
 ; if duplicate, change ien to orginal msg ien
 I $G(HLASTRSP) D
 . S HLMTIENS=+$G(HLASTMSG("OIENS"))
 . S HLMTIEN=+$G(^HLMA(HLMTIENS,0))
 ; patch HL*1.6*142 end
 ;
CONT ;continue processing an enhance ack msg. called from DEFACK
 ;Set special HL variables for processing rtn
 S HLQUIT=0,HLNODE="",HLNEXT="D HLNEXT^HLCSUTL"
 ;
 ; message is an acknowledgement, HLMSA=ack code^id^text
 I ($G(HLMSA)]"") D  Q
 . ;X=1 if ack ok, 0=reject of error
 . S X=$E(HLMSA,2)="A"
 . ;Update status of original message and remove it from the queue
 . D STATUS^HLTF0(HL("MTIENS"),$S(X:3,1:4),"",$S(X:"",1:$P(HLMSA,HL("FS"),3)),1)
 . ; patch HL*1.6*142
 . ; time: original message receives the application ACK
 . S $P(^HLMA(HL("MTIENS"),"S"),"^",5)=$$NOW^XLFDT
 . D DEQUE^HLCSREP($P($G(^HLMA(HL("MTIENS"),0)),"^",7),"O",HL("MTIENS"))
 . D
 .. N HLTCP ;variable to update status in file #772.
 ..;
 ..;**108**
 .. N TEMP
 .. S TEMP=HLMTIENS
 .. N HLMTIENS
 .. S HLMTIENS=TEMP
 ..;**END 108**
 ..;
 .. ; patch HL*1.6*142 start
 .. ; time: starts to process the incoming message
 .. S $P(^HLMA(HLMTIENS,"S"),"^",6)=$$NOW^XLFDT
 .. D PROCACK^HLTP2(HLMTIEN,HL("EID"),.HLRESLT,.HL)
 .. ; time: ends processing the incoming message
 .. S $P(^HLMA(HLMTIENS,"S"),"^",7)=$$NOW^XLFDT
 . ; if duplicate, and the original msg failed to
 . ; complete the processing
 . I $G(HLASTRSP) D STATUS^HLTF0(HLASTRSP,3,,,1)
 . ; patch HL*1.6*142 end
 . ;update status of incoming & unlock
 . D STATUS^HLTF0(HLMTIENS,$S($G(HLRESLT):4,1:3),$S($G(HLRESLT):+$G(HLRESLT),1:""),$S($G(HLRESLT):$P(HLRESLT,U,2),1:""),1),EXIT
 ;
 ;get entry action, exit action and processing routine
 K HLHDR,HLLD0,HLLD1,HLMSA
 I HL("EIDS")="",$G(HLEIDS)]"" S HL("EIDS")=HLEIDS ;**CIRN**
 D EVENT^HLUTIL1(HL("EIDS"),"15,20,771",.HLN)
 S HLENROU=$G(HLN(20)),HLEXROU=$G(HLN(15)),HLPROU=$G(HLN(771))
 ;quit if no processing routine,update status and quit
 I HLPROU']"" S HLRESLT="10^"_$G(^HL(771.7,10,0)) D STATUS^HLTF0(HLMTIENS,3,,,1),EXIT Q
 ;HLORNOD=subscriber protocol for Fileman auditing, ien;global ref
 N HLORNODD S HLORNOD=HL("EIDS")_";ORD(101,"
 ;Execute entry action of client protocol
 X:HLENROU]"" HLENROU K HLENROU,HLDONE1
 ;
 ; patch HL*1.6*142 start
 ; time: starts to process the incoming message
 S $P(^HLMA(HLMTIENS,"S"),"^",6)=$$NOW^XLFDT
 ;Execute processing routine
 X HLPROU S HLRESLT=0 S:($D(HLERR)) HLRESLT="9^"_HLERR
 ; time: ends processing the incoming message
 S $P(^HLMA(HLMTIENS,"S"),"^",7)=$$NOW^XLFDT
 ; if duplicate, and the original msg failed to
 ; complete the processing
 I $G(HLASTRSP) D STATUS^HLTF0(HLASTRSP,3,,,1)
 ; patch HL*1.6*142 end
 ;update status of incoming to complete & unlock
 D STATUS^HLTF0(HLMTIENS,$S(HLRESLT:4,1:3),$S(HLRESLT:+HLRESLT,1:""),$S(HLRESLT:$P(HLRESLT,U,2),1:""),1,$S($G(HLERR("SKIP_EVENT"))=1:1,1:0)),EXIT
 ;HLTCPO=link open, HLTCP=ien of ack msg. from GENACK
ACK I $G(HLTCPO),$G(HLTCP) D  Q
 . D LLCNT^HLCSTCP(HLDP,3)
 . ;write ack back over open tcp link
 . S X=$$WRITE^HLCSTCP2(HLTCP)
 . ;update status of ack to complete
 . D:'$G(HLASTRSP) STATUS^HLTF0(HLTCP,3,,,1)
 . D LLCNT^HLCSTCP(HLDP,4)
 Q
 ;
DEFACK(HLDP,X) ;process the deferred application ack, called from HLCSIN
 ;HLDP=logical link, X=ien in file 773
 ;
 ; patch HL*1.6*120 start
 ; clean non-Kernel variables
 D
 . ; protect variables defined in STARTIN^HLCSIN
 . N HLFLG,HLEXIT,HLPTRFLR
 . ; protect variables defined in DEFACK^HLCSIN
 . N HLXX,HLD0,HLPCT
 . ; protect input parameters of this sub-routine
 . N HLDP,X
 . D KILL^XUSCLEAN
 ; patch HL*1.6*120 end
 ;
 ;set error trap
 N $ETRAP,$ESTACK S $ETRAP="D ERROR^HLTP3"
 N HLERR     ;patch HL*1.6*109
 Q:'$G(HLDP)!'$G(X)  Q:'$G(^HLMA(X,0))
 Q:'$D(^HLMA("AC","I",HLDP,X))
 ;
 N HL,HLA,HLD0,HLEID,HLEIDS,HLHDR,HLHDRO,HLMTIEN,HLMTIENS,HLJ,HLMSA,HLN,HLQUIT,HLNODE,HLNEXT,HLRESLT,HLRESLTA,HLTCP,HLXX,Z,HLDONE1
 S HLMTIENS=X,X=^HLMA(HLMTIENS,0),HLMTIEN=+$P(X,U),HL("MID")=$P(X,U,2),HL("MTIENS")=$P(X,U,10),HL("LL")=$P(X,U,7),HLTCP="",HL("Q")=""""""
 S HL("EIDS")=$P(X,U,8),HL("SAP")=$P(X,U,11),HL("RAP")=$P(X,U,12),HL("MTP")=$P(X,U,13),HL("ETP")=$P(X,U,14)
 S:$P(X,U,15) HL("MTP_ETP")=$P(X,U,15)
 S:HL("SAP") HL("SAN")=$P($G(^HL(771,HL("SAP"),0)),U) S:HL("RAP") HL("RAN")=$P($G(^HL(771,HL("RAP"),0)),U)
 S:HL("MTP") HL("MTN")=$P($G(^HL(771.2,HL("MTP"),0)),U) S:HL("ETP") HL("ETN")=$P($G(^HL(779.001,HL("ETP"),0)),U)
 S:$G(HL("MTP_ETP")) HL("MTN_ETN")=$P($G(^HL(779.005,HL("MTP_ETP"),0)),U)
 S HL("EID")=$P($G(^HL(772,HLMTIEN,0)),U,10)
 M HLHDRO=^HLMA(HLMTIENS,"MSH")
 ; if no header quit
 Q:'$O(HLHDRO(0))
 ;
 S HL("FS")=$E(HLHDRO(1,0),4),HL("ECH")=$$P^HLTPCK2(.HLHDRO,2),HL("SFN")=$$P^HLTPCK2(.HLHDRO,4),HL("RFN")=$$P^HLTPCK2(.HLHDRO,6),HL("DTM")=$$P^HLTPCK2(.HLHDRO,7)
 ;
 ; quit if ien of #772 is not defined
 Q:'HLMTIEN
 ; quit if field separator is not defined
 Q:HL("FS")=""
 ;
 S X=$$P^HLTPCK2(.HLHDRO,1)
 ;
 ; patch HL*1.6*120 start
 I X="MSH" D
 . S HL("PID")=$$P^HLTPCK2(.HLHDRO,11),HL("VER")=$$P^HLTPCK2(.HLHDRO,12),HL("APAT")=$$P^HLTPCK2(.HLHDRO,16),HL("CC")=$$P^HLTPCK2(.HLHDRO,17)
 . ;
 . ; 2nd component is Processing mode
 . S HL("PMOD")=$P(HL("PID"),$E(HL("ECH"),1),2)
 . ; first component is Processing id
 . S HL("PID")=$P(HL("PID"),$E(HL("ECH"),1))
 ;
 I X'="MSH" D
 . S X=$$P^HLTPCK2(.HLHDRO,9),Z=$E(HL("ECH")),HL("PID")=$P(X,Z,2),HL("VER")=$P(X,Z,4)
 . ;
 . ; original code incorrectly treats repetition separator as
 . ; subcomponent separator
 . I $E(HL("ECH"),2)]"",X[$E(HL("ECH"),2) D
 .. S HL("SUB-COMPONENT")=$E(HL("ECH"),2)
 . ; if subcomponent separator is correctly applied
 . I $E(HL("ECH"),4)]"",X[$E(HL("ECH"),4) D
 .. S HL("SUB-COMPONENT")=$E(HL("ECH"),4)
 . ;
 . I $D(HL("SUB-COMPONENT")),HL("PID")[HL("SUB-COMPONENT") D
 .. ; 2nd sub-component is Processing mode
 .. S HL("PMOD")=$P(HL("PID"),HL("SUB-COMPONENT"),2)
 .. ; first sub-component is Processing id
 .. S HL("PID")=$P(HL("PID"),HL("SUB-COMPONENT"))
 . ; patch HL*1.6*120 end
 . ;
 . Q:$$P^HLTPCK2(.HLHDRO,10)=""
 . ;HLMSA=ack code^id^text
 . S HLMSA=$P($$P^HLTPCK2(.HLHDRO,10),$E(HL("ECH")),1),$P(HLMSA,HL("FS"),2)=$$P^HLTPCK2(.HLHDRO,12),$P(HLMSA,HL("FS"),3)=$P($$P^HLTPCK2(.HLHDRO,10),$E(HL("ECH")),2),HL("MSAID")=$P(HLMSA,HL("FS"),2)
 ;
 ; quit if this is a commit ack
 I $P($G(^HL(772,HLMTIEN,"IN",1,0)),HL("FS"),1)="MSA",$E($P($G(^HL(772,HLMTIEN,"IN",1,0)),HL("FS"),2))="C" Q
 ;
 ;**  HL*1.6*117 **
 K HLL("SET FOR APP ACK"),HLL("LINKS")
 ;
 D CONT
 Q
 ;
MSA(Y) ;Y=ien in 772, returns MSA segment
 ;ack code^msg being ack id^text
 ; patch HL*1.6*122
 ; for HL7 v2.5 and beyond with MSA as 3rd segment
 N X,SUBIEN,DATA,DONE
 S X=$G(^HL(772,Y,"IN",1,0)),X=$S($E(X,1,3)="MSA":$E(X,5,999),1:"")
 Q:X]"" X
 ;
 S DONE=0
 S SUBIEN=1
 F  S SUBIEN=$O(^HL(772,Y,"IN",SUBIEN)) Q:'SUBIEN  D  Q:DONE
 . S DATA=$G(^HL(772,Y,"IN",SUBIEN,0)) I DATA="" D
 .. S DONE=1
 .. S SUBIEN=$O(^HL(772,Y,"IN",SUBIEN)) Q:'SUBIEN
 .. S X=$G(^HL(772,Y,"IN",SUBIEN,0)),X=$S($E(X,1,3)="MSA":$E(X,5,999),1:"")
 ; patch HL*1.6*122 end
 ;
 Q X
 ;
ERROR ;error trap
 D ^%ZTER
 I $G(HLMTIENS),$D(^HLMA(HLMTIENS,0)) D STATUS^HLTF0(HLMTIENS,4,,,1),EXIT
 ; release locks created by inbound filer
 ; patch HL*1.6*140
 ; L -^HLMA("AC","I",+$G(HLXX))
 L -^HLMA("IN-FILER","AC","I",+$G(HLXX))
 G UNWIND^%ZTER
 ;
 ;
EXIT ;unlock
 I $G(HLMTIENS) L -^HLMA(HLMTIENS)
 Q
 ;
ONAC(IEN773) ;
 ;Returns 1 if the message is on the "AC","I" xref
 ;Returns 0 otherwise
 ;
 N LINK
 S LINK=$P($G(^HLMA(IEN773,0)),"^",17)
 Q:'LINK 0
 Q $D(^HLMA("AC","I",LINK,IEN773))
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HHLTP3   13938     printed  Sep 23, 2025@19:36:07                                                                                                                                                                                                      Page 2
HLTP3     ;SFIRMFO/RSD - Transaction Processor for TCP ;07/29/2009  14:51
 +1       ;;1.6;HEALTH LEVEL SEVEN;**19,43,57,58,59,66,69,109,115,108,116,117,125,120,133,122,140,142,145**;Oct 13, 1995;Build 4
 +2       ;Per VHA Directive 2004-038, this routine should not be modified.
 +3       ;
 +4        QUIT 
NEW(X)    ;process new msg. ien in 773^ien in 772
 +1       ;HLMTIENS=ien in #773; HLMTIEN=ien in #772
 +2       ;HLHDRO=original header;  HLHDR=response header
 +3       ;set error trap
 +4        NEW $ETRAP,$ESTACK
           SET $ETRAP="D ERROR^HLTP3"
 +5        NEW HL,HLEID,HLEIDS,HLERR,HLHDR,HLHDRO,HLMTIEN,HLMTIENS,HLJ,HLMSA,HLQUIT,HLNODE,HLNEXT,HLRESLTA,HLDONE1,HLASTRSP,HLRESLT
 +6        SET HLRESLT=""
 +7        DO INIT^HLTP3A
 +8       ;error with header, return commit/app reject
 +9        IF $GET(HLRESLT)
               Begin DoDot:1
 +10      ;set status & unlock record
 +11               DO STATUS^HLTF0(HLMTIENS,4,,,1)
                   DO EXIT
 +12      ;quit if no commit or app ack
 +13               IF $GET(HL("ACAT"))="NE"
                       IF $GET(HL("APAT"))="NE"
                           QUIT 
 +14               SET X=$SELECT($GET(HL("ACAT"))="AL":"CR",1:"AR")
 +15      ;HLTCP=ien of acknowledgment msg. from ACK^HLTP4
 +16               DO ACK^HLTP4(X,$PIECE(HLRESLT,U,2))
                   if '$GET(HLTCP)
                       QUIT 
 +17      ;write ack back
 +18               SET X=$$WRITE^HLCSTCP2(HLTCP)
 +19      ;update counter to sent
 +20               DO LLCNT^HLCSTCP(HLDP,4)
 +21      ;update status of ack
 +22               DO STATUS^HLTF0(HLTCP,3,,,1)
               End DoDot:1
               QUIT 
 +23      ;
 +24      ;check for duplicate msg., use rec. app and msg. id x-ref
 +25      ; patch HL*1.6*142 start
 +26      ; HL("HDR FLDS:3-6") extracted from field 3 to field 6 of header
 +27      ; defined in HLDIE routine
 +28      ; I $G(HL("MID"))]"",$G(HL("RAP")) S X=$O(^HLMA("AH",HL("RAP"),HL("MID"),0)) D  Q:'$D(HLMTIENS)
 +29       IF ($GET(HL("MID"))]"")
               IF ($GET(HL("HDR FLDS:3-6"))]"")
                   Begin DoDot:1
 +30                   SET X=$ORDER(^HLMA("AH-NEW",HL("HDR FLDS:3-6"),HL("MID"),0))
 +31      ; patch HL*1.6*142 end
 +32      ;HLASTMSG=last ien received during this connection
 +33      ;if no duplicate, save msg. ien and quit
 +34                   IF X=HLMTIENS!'X
                           SET HLASTMSG=HLMTIENS
                           QUIT 
 +35                   NEW MSH,OIENS
 +36                   SET (OIENS,Y)=X
                       Begin DoDot:2
 +37      ;combine MSH into single string
 +38                       SET MSH(Y)=""
                           SET I=0
                           FOR 
                               SET I=$ORDER(^HLMA(Y,"MSH",I))
                               if 'I
                                   QUIT 
                               SET MSH(Y)=MSH(Y)_$GET(^(I,0))
                       End DoDot:2
                       SET Y=HLMTIENS
                       Begin DoDot:2
                       End DoDot:2
 +39      ; patch 117 & 125, check if identical
 +40                   IF MSH(HLMTIENS)'=MSH(OIENS)
                           SET HLASTMSG=HLMTIENS
                           QUIT 
 +41      ;
 +42      ;msg is duplicate, set status
 +43                   DO STATUS^HLTF0(HLMTIENS,4,109,"Duplicate with ien "_OIENS,1)
                       DO EXIT
 +44      ;msg was resent, ignore it.
 +45                   IF HLASTMSG=HLMTIENS
                           KILL HLMTIENS
                           QUIT 
 +46      ;find original response and send back
 +47                   SET HLASTRSP=$ORDER(^HLMA("AF",OIENS,OIENS))
 +48      ; patch HL*1.6*142 start
 +49      ; the original msg may need to be updated again if 1st time
 +50      ; update failed
 +51                   SET HLASTMSG("OIENS")=OIENS
 +52      ;
 +53      ; the original message and its commit ACK were purged, OIENS is
 +54      ; duplicate and needs to create its own commit ACK (happened
 +55      ; between MPI and VIE in 9/2008), the OIENS will be processed
 +56      ; by the application routine again.
 +57                   IF $GET(HL("ACAT"))="AL"
                           IF '$GET(HL("ACK"))
                               IF 'HLASTRSP
                                   Begin DoDot:2
 +58                                   NEW HLTCP,HLMTIENS
 +59                                   SET HLMTIENS=OIENS
 +60                                   DO ACK^HLTP4("CA")
 +61      ; decreament and will be added later
                                       DO LLCNT^HLCSTCP(HLDP,3,1)
 +62                                   SET HLASTRSP=HLTCP
                                   End DoDot:2
 +63      ; patch HL*1.6*142 end
                   End DoDot:1
                   if '$DATA(HLMTIENS)
                       QUIT 
 +64      ;
 +65      ; patch HL*1.6*145 start
 +66      ; Quit if this is application ack to application ack
 +67       IF $GET(HL("ACK"))
               Begin DoDot:1
 +68               NEW HLERRMG,X
 +69               SET HLERRMG="Received application acknowledgement to an application acknowledgement"
 +70      ;msg is a resend, HLASTRSP=ien of original response (commit ACK)
 +71               IF $GET(HLASTRSP)
                       Begin DoDot:2
 +72                       SET HLTCP=HLASTRSP
 +73                       DO STATUS^HLTF0(HLTCP,8)
 +74                       SET ^HLMA(+HLTCP,"S")=$$NOW^XLFDT
 +75                       DO LLCNT^HLCSTCP(HLDP,3)
                       End DoDot:2
 +76              IF '$TEST
                       Begin DoDot:2
 +77      ;Send CR and update status of original and current ack messages
 +78                       DO ACK^HLTP4("CR",HLERRMG)
                       End DoDot:2
                       if '$GET(HLTCP)
                           QUIT 
 +79      ;
 +80      ; write commit ACK (original commit ACK)
 +81               SET X=$$WRITE^HLCSTCP2(HLTCP)
 +82               DO STATUS^HLTF0(HLTCP,3,,"'Reject' commit ACK: "_HLERRMG,1)
 +83               SET ^HLMA(+HLTCP,"S")=$$NOW^XLFDT
 +84               DO LLCNT^HLCSTCP(HLDP,4)
 +85               SET HLTCP=""
 +86      ; D STATUS^HLTF0(HL("MTIENS"),3,,,1),STATUS^HLTF0(HLMTIENS,3,,,1)
 +87               DO STATUS^HLTF0(HL("MTIENS"),3,,,1)
 +88               DO STATUS^HLTF0(HLMTIENS,4,,HLERRMG,1)
 +89      ;unlock record
 +90               DO EXIT
               End DoDot:1
               QUIT 
 +91      ; patch HL*1.6*145 end
 +92      ;
 +93      ; enhance ack., send commit, quit if not an ack, msg will be 
 +94      ; processed by filer
 +95       IF $GET(HL("ACAT"))="AL"
               Begin DoDot:1
 +96      ;msg is a resend, HLASTRSP=ien of original response (commit ACK)
 +97               IF $GET(HLASTRSP)
                       Begin DoDot:2
 +98                       SET HLTCP=HLASTRSP
 +99                       DO LLCNT^HLCSTCP(HLDP,3)
                       End DoDot:2
 +100             IF '$TEST
                       Begin DoDot:2
 +101     ;**109** LLCNT^HLCSTCP(HLDP,3) called in ACK^HLTP4
                           DO ACK^HLTP4("CA")
                       End DoDot:2
                       if '$GET(HLTCP)
                           QUIT 
 +102     ;
 +103     ; write commit ACK (original commit ACK)
 +104              SET X=$$WRITE^HLCSTCP2(HLTCP)
 +105     ; patch HL*1.6*142
 +106     ; D LLCNT^HLCSTCP(HLDP,4),STATUS^HLTF0(HLTCP,3,,,1):'$G(HLASTRSP)
 +107              DO LLCNT^HLCSTCP(HLDP,4)
 +108              IF '$GET(HLASTRSP)
                       Begin DoDot:2
 +109                      DO STATUS^HLTF0(HLTCP,3,,,1)
                       End DoDot:2
 +110              SET HLTCP=""
 +111     ;if not an ack, set status to awaiting processing **109** and put on in queue
 +112              IF '$GET(HL("MTIENS"))
                       IF '$GET(HLASTRSP)
                           DO STATUS^HLTF0(HLMTIENS,9)
                           DO EXIT
                           DO SETINQUE^HLTP31
 +113     ;
 +114     ; patch HL*1.6*142 start
 +115     ;if the original msg failed to en-queue and update status
 +116     ; it may happen when COTS disconnect the listener during
 +117     ; writing the commit ACK
 +118     ; deal with a non-application ACK duplicate message
 +119              IF '$GET(HL("MTIENS"))
                       IF $GET(HLASTRSP)
                           Begin DoDot:2
 +120                          NEW STATUS
 +121                          SET STATUS=+$GET(^HLMA(HLASTRSP,"P"))
 +122                          IF STATUS
                                   IF (STATUS'=3)
                                       Begin DoDot:3
 +123     ; update the original messsage, ien=HLASTMSG("OIENS")
 +124                                      DO STATUS^HLTF0(HLASTMSG("OIENS"),9)
 +125                                      DO EXIT
 +126                                      NEW HLMTIENS
 +127                                      SET HLMTIENS=HLASTMSG("OIENS")
 +128                                      DO SETINQUE^HLTP31
 +129                                      DO STATUS^HLTF0(HLASTRSP,3,,,1)
                                       End DoDot:3
                           End DoDot:2
 +130     ; patch HL*1.6*142 end
               End DoDot:1
               if '$GET(HL("MTIENS"))
                   QUIT 
 +131     ;
 +132     ;enhance ack., no commit & no app ack
 +133      IF $GET(HL("ACAT"))="NE"
               IF $GET(HL("APAT"))="NE"
                   Begin DoDot:1
 +134     ;set status to awaiting processing, **109** and put on in queue
 +135                  IF '$GET(HLASTRSP)
                           DO STATUS^HLTF0(HLMTIENS,9)
                           DO EXIT
                           DO SETINQUE^HLTP31
                   End DoDot:1
                   QUIT 
 +136     ;
 +137     ; patch HL*1.6*120 start
 +138     ;resending old response, msg is a resend
 +139     ; do not re-send duplicate when $G(HL("ACAT"))="AL"
 +140     ; the following resend is for original mode application ACK
 +141      IF $GET(HLASTRSP)
               IF $GET(HL("ACAT"))'="AL"
                   SET HLTCP=HLASTRSP
                   GOTO ACK
 +142     ; patch HL*1.6*120 end
 +143     ;
 +144     ; patch HL*1.6*142 start
 +145     ; to handle duplicate when the original message encountered
 +146     ; a write error of commit ACK
 +147     ; quit if duplicate
 +148     ; Q:$G(HLASTRSP)
 +149      SET HLASTRSP("FLAG")=0
 +150      IF $GET(HLASTRSP)
               IF $GET(HL("ACAT"))="AL"
                   Begin DoDot:1
 +151                  IF +$GET(^HLMA(+$GET(HLASTRSP),"P"))
                           IF (+$PIECE($GET(^HLMA(+$GET(HLASTRSP),"P")),"^")'=3)
                               Begin DoDot:2
 +152                              SET HLASTRSP("FLAG")=1
                               End DoDot:2
                   End DoDot:1
 +153     ; don't quit if this is duplicate application ACK msg with accept
 +154     ; ACK type="AL", and its original commit ACK is not done.
 +155      IF $GET(HLASTRSP)
               IF ('HLASTRSP("FLAG"))
                   QUIT 
 +156     ;
 +157     ; if duplicate, change ien to orginal msg ien
 +158      IF $GET(HLASTRSP)
               Begin DoDot:1
 +159              SET HLMTIENS=+$GET(HLASTMSG("OIENS"))
 +160              SET HLMTIEN=+$GET(^HLMA(HLMTIENS,0))
               End DoDot:1
 +161     ; patch HL*1.6*142 end
 +162     ;
CONT      ;continue processing an enhance ack msg. called from DEFACK
 +1       ;Set special HL variables for processing rtn
 +2        SET HLQUIT=0
           SET HLNODE=""
           SET HLNEXT="D HLNEXT^HLCSUTL"
 +3       ;
 +4       ; message is an acknowledgement, HLMSA=ack code^id^text
 +5        IF ($GET(HLMSA)]"")
               Begin DoDot:1
 +6       ;X=1 if ack ok, 0=reject of error
 +7                SET X=$EXTRACT(HLMSA,2)="A"
 +8       ;Update status of original message and remove it from the queue
 +9                DO STATUS^HLTF0(HL("MTIENS"),$SELECT(X:3,1:4),"",$SELECT(X:"",1:$PIECE(HLMSA,HL("FS"),3)),1)
 +10      ; patch HL*1.6*142
 +11      ; time: original message receives the application ACK
 +12               SET $PIECE(^HLMA(HL("MTIENS"),"S"),"^",5)=$$NOW^XLFDT
 +13               DO DEQUE^HLCSREP($PIECE($GET(^HLMA(HL("MTIENS"),0)),"^",7),"O",HL("MTIENS"))
 +14               Begin DoDot:2
 +15      ;variable to update status in file #772.
                       NEW HLTCP
 +16      ;
 +17      ;**108**
 +18                   NEW TEMP
 +19                   SET TEMP=HLMTIENS
 +20                   NEW HLMTIENS
 +21                   SET HLMTIENS=TEMP
 +22      ;**END 108**
 +23      ;
 +24      ; patch HL*1.6*142 start
 +25      ; time: starts to process the incoming message
 +26                   SET $PIECE(^HLMA(HLMTIENS,"S"),"^",6)=$$NOW^XLFDT
 +27                   DO PROCACK^HLTP2(HLMTIEN,HL("EID"),.HLRESLT,.HL)
 +28      ; time: ends processing the incoming message
 +29                   SET $PIECE(^HLMA(HLMTIENS,"S"),"^",7)=$$NOW^XLFDT
                   End DoDot:2
 +30      ; if duplicate, and the original msg failed to
 +31      ; complete the processing
 +32               IF $GET(HLASTRSP)
                       DO STATUS^HLTF0(HLASTRSP,3,,,1)
 +33      ; patch HL*1.6*142 end
 +34      ;update status of incoming & unlock
 +35               DO STATUS^HLTF0(HLMTIENS,$SELECT($GET(HLRESLT):4,1:3),$SELECT($GET(HLRESLT):+$GET(HLRESLT),1:""),$SELECT($GET(HLRESLT):$PIECE(HLRESLT,U,2),1:""),1)
                   DO EXIT
               End DoDot:1
               QUIT 
 +36      ;
 +37      ;get entry action, exit action and processing routine
 +38       KILL HLHDR,HLLD0,HLLD1,HLMSA
 +39      ;**CIRN**
           IF HL("EIDS")=""
               IF $GET(HLEIDS)]""
                   SET HL("EIDS")=HLEIDS
 +40       DO EVENT^HLUTIL1(HL("EIDS"),"15,20,771",.HLN)
 +41       SET HLENROU=$GET(HLN(20))
           SET HLEXROU=$GET(HLN(15))
           SET HLPROU=$GET(HLN(771))
 +42      ;quit if no processing routine,update status and quit
 +43       IF HLPROU']""
               SET HLRESLT="10^"_$GET(^HL(771.7,10,0))
               DO STATUS^HLTF0(HLMTIENS,3,,,1)
               DO EXIT
               QUIT 
 +44      ;HLORNOD=subscriber protocol for Fileman auditing, ien;global ref
 +45       NEW HLORNODD
           SET HLORNOD=HL("EIDS")_";ORD(101,"
 +46      ;Execute entry action of client protocol
 +47       if HLENROU]""
               XECUTE HLENROU
           KILL HLENROU,HLDONE1
 +48      ;
 +49      ; patch HL*1.6*142 start
 +50      ; time: starts to process the incoming message
 +51       SET $PIECE(^HLMA(HLMTIENS,"S"),"^",6)=$$NOW^XLFDT
 +52      ;Execute processing routine
 +53       XECUTE HLPROU
           SET HLRESLT=0
           if ($DATA(HLERR))
               SET HLRESLT="9^"_HLERR
 +54      ; time: ends processing the incoming message
 +55       SET $PIECE(^HLMA(HLMTIENS,"S"),"^",7)=$$NOW^XLFDT
 +56      ; if duplicate, and the original msg failed to
 +57      ; complete the processing
 +58       IF $GET(HLASTRSP)
               DO STATUS^HLTF0(HLASTRSP,3,,,1)
 +59      ; patch HL*1.6*142 end
 +60      ;update status of incoming to complete & unlock
 +61       DO STATUS^HLTF0(HLMTIENS,$SELECT(HLRESLT:4,1:3),$SELECT(HLRESLT:+HLRESLT,1:""),$SELECT(HLRESLT:$PIECE(HLRESLT,U,2),1:""),1,$SELECT($GET(HLERR("SKIP_EVENT"))=1:1,1:0))
           DO EXIT
 +62      ;HLTCPO=link open, HLTCP=ien of ack msg. from GENACK
ACK        IF $GET(HLTCPO)
               IF $GET(HLTCP)
                   Begin DoDot:1
 +1                    DO LLCNT^HLCSTCP(HLDP,3)
 +2       ;write ack back over open tcp link
 +3                    SET X=$$WRITE^HLCSTCP2(HLTCP)
 +4       ;update status of ack to complete
 +5                    if '$GET(HLASTRSP)
                           DO STATUS^HLTF0(HLTCP,3,,,1)
 +6                    DO LLCNT^HLCSTCP(HLDP,4)
                   End DoDot:1
                   QUIT 
 +7        QUIT 
 +8       ;
DEFACK(HLDP,X) ;process the deferred application ack, called from HLCSIN
 +1       ;HLDP=logical link, X=ien in file 773
 +2       ;
 +3       ; patch HL*1.6*120 start
 +4       ; clean non-Kernel variables
 +5        Begin DoDot:1
 +6       ; protect variables defined in STARTIN^HLCSIN
 +7            NEW HLFLG,HLEXIT,HLPTRFLR
 +8       ; protect variables defined in DEFACK^HLCSIN
 +9            NEW HLXX,HLD0,HLPCT
 +10      ; protect input parameters of this sub-routine
 +11           NEW HLDP,X
 +12           DO KILL^XUSCLEAN
           End DoDot:1
 +13      ; patch HL*1.6*120 end
 +14      ;
 +15      ;set error trap
 +16       NEW $ETRAP,$ESTACK
           SET $ETRAP="D ERROR^HLTP3"
 +17      ;patch HL*1.6*109
           NEW HLERR
 +18       if '$GET(HLDP)!'$GET(X)
               QUIT 
           if '$GET(^HLMA(X,0))
               QUIT 
 +19       if '$DATA(^HLMA("AC","I",HLDP,X))
               QUIT 
 +20      ;
 +21       NEW HL,HLA,HLD0,HLEID,HLEIDS,HLHDR,HLHDRO,HLMTIEN,HLMTIENS,HLJ,HLMSA,HLN,HLQUIT,HLNODE,HLNEXT,HLRESLT,HLRESLTA,HLTCP,HLXX,Z,HLDONE1
 +22       SET HLMTIENS=X
           SET X=^HLMA(HLMTIENS,0)
           SET HLMTIEN=+$PIECE(X,U)
           SET HL("MID")=$PIECE(X,U,2)
           SET HL("MTIENS")=$PIECE(X,U,10)
           SET HL("LL")=$PIECE(X,U,7)
           SET HLTCP=""
           SET HL("Q")=""""""
 +23       SET HL("EIDS")=$PIECE(X,U,8)
           SET HL("SAP")=$PIECE(X,U,11)
           SET HL("RAP")=$PIECE(X,U,12)
           SET HL("MTP")=$PIECE(X,U,13)
           SET HL("ETP")=$PIECE(X,U,14)
 +24       if $PIECE(X,U,15)
               SET HL("MTP_ETP")=$PIECE(X,U,15)
 +25       if HL("SAP")
               SET HL("SAN")=$PIECE($GET(^HL(771,HL("SAP"),0)),U)
           if HL("RAP")
               SET HL("RAN")=$PIECE($GET(^HL(771,HL("RAP"),0)),U)
 +26       if HL("MTP")
               SET HL("MTN")=$PIECE($GET(^HL(771.2,HL("MTP"),0)),U)
           if HL("ETP")
               SET HL("ETN")=$PIECE($GET(^HL(779.001,HL("ETP"),0)),U)
 +27       if $GET(HL("MTP_ETP"))
               SET HL("MTN_ETN")=$PIECE($GET(^HL(779.005,HL("MTP_ETP"),0)),U)
 +28       SET HL("EID")=$PIECE($GET(^HL(772,HLMTIEN,0)),U,10)
 +29       MERGE HLHDRO=^HLMA(HLMTIENS,"MSH")
 +30      ; if no header quit
 +31       if '$ORDER(HLHDRO(0))
               QUIT 
 +32      ;
 +33       SET HL("FS")=$EXTRACT(HLHDRO(1,0),4)
           SET HL("ECH")=$$P^HLTPCK2(.HLHDRO,2)
           SET HL("SFN")=$$P^HLTPCK2(.HLHDRO,4)
           SET HL("RFN")=$$P^HLTPCK2(.HLHDRO,6)
           SET HL("DTM")=$$P^HLTPCK2(.HLHDRO,7)
 +34      ;
 +35      ; quit if ien of #772 is not defined
 +36       if 'HLMTIEN
               QUIT 
 +37      ; quit if field separator is not defined
 +38       if HL("FS")=""
               QUIT 
 +39      ;
 +40       SET X=$$P^HLTPCK2(.HLHDRO,1)
 +41      ;
 +42      ; patch HL*1.6*120 start
 +43       IF X="MSH"
               Begin DoDot:1
 +44               SET HL("PID")=$$P^HLTPCK2(.HLHDRO,11)
                   SET HL("VER")=$$P^HLTPCK2(.HLHDRO,12)
                   SET HL("APAT")=$$P^HLTPCK2(.HLHDRO,16)
                   SET HL("CC")=$$P^HLTPCK2(.HLHDRO,17)
 +45      ;
 +46      ; 2nd component is Processing mode
 +47               SET HL("PMOD")=$PIECE(HL("PID"),$EXTRACT(HL("ECH"),1),2)
 +48      ; first component is Processing id
 +49               SET HL("PID")=$PIECE(HL("PID"),$EXTRACT(HL("ECH"),1))
               End DoDot:1
 +50      ;
 +51       IF X'="MSH"
               Begin DoDot:1
 +52               SET X=$$P^HLTPCK2(.HLHDRO,9)
                   SET Z=$EXTRACT(HL("ECH"))
                   SET HL("PID")=$PIECE(X,Z,2)
                   SET HL("VER")=$PIECE(X,Z,4)
 +53      ;
 +54      ; original code incorrectly treats repetition separator as
 +55      ; subcomponent separator
 +56               IF $EXTRACT(HL("ECH"),2)]""
                       IF X[$EXTRACT(HL("ECH"),2)
                           Begin DoDot:2
 +57                           SET HL("SUB-COMPONENT")=$EXTRACT(HL("ECH"),2)
                           End DoDot:2
 +58      ; if subcomponent separator is correctly applied
 +59               IF $EXTRACT(HL("ECH"),4)]""
                       IF X[$EXTRACT(HL("ECH"),4)
                           Begin DoDot:2
 +60                           SET HL("SUB-COMPONENT")=$EXTRACT(HL("ECH"),4)
                           End DoDot:2
 +61      ;
 +62               IF $DATA(HL("SUB-COMPONENT"))
                       IF HL("PID")[HL("SUB-COMPONENT")
                           Begin DoDot:2
 +63      ; 2nd sub-component is Processing mode
 +64                           SET HL("PMOD")=$PIECE(HL("PID"),HL("SUB-COMPONENT"),2)
 +65      ; first sub-component is Processing id
 +66                           SET HL("PID")=$PIECE(HL("PID"),HL("SUB-COMPONENT"))
                           End DoDot:2
 +67      ; patch HL*1.6*120 end
 +68      ;
 +69               if $$P^HLTPCK2(.HLHDRO,10)=""
                       QUIT 
 +70      ;HLMSA=ack code^id^text
 +71               SET HLMSA=$PIECE($$P^HLTPCK2(.HLHDRO,10),$EXTRACT(HL("ECH")),1)
                   SET $PIECE(HLMSA,HL("FS"),2)=$$P^HLTPCK2(.HLHDRO,12)
                   SET $PIECE(HLMSA,HL("FS"),3)=$PIECE($$P^HLTPCK2(.HLHDRO,10),$EXTRACT(HL("ECH")),2)
                   SET HL("MSAID")=$PIECE(HLMSA,HL("FS"),2)
               End DoDot:1
 +72      ;
 +73      ; quit if this is a commit ack
 +74       IF $PIECE($GET(^HL(772,HLMTIEN,"IN",1,0)),HL("FS"),1)="MSA"
               IF $EXTRACT($PIECE($GET(^HL(772,HLMTIEN,"IN",1,0)),HL("FS"),2))="C"
                   QUIT 
 +75      ;
 +76      ;**  HL*1.6*117 **
 +77       KILL HLL("SET FOR APP ACK"),HLL("LINKS")
 +78      ;
 +79       DO CONT
 +80       QUIT 
 +81      ;
MSA(Y)    ;Y=ien in 772, returns MSA segment
 +1       ;ack code^msg being ack id^text
 +2       ; patch HL*1.6*122
 +3       ; for HL7 v2.5 and beyond with MSA as 3rd segment
 +4        NEW X,SUBIEN,DATA,DONE
 +5        SET X=$GET(^HL(772,Y,"IN",1,0))
           SET X=$SELECT($EXTRACT(X,1,3)="MSA":$EXTRACT(X,5,999),1:"")
 +6        if X]""
               QUIT X
 +7       ;
 +8        SET DONE=0
 +9        SET SUBIEN=1
 +10       FOR 
               SET SUBIEN=$ORDER(^HL(772,Y,"IN",SUBIEN))
               if 'SUBIEN
                   QUIT 
               Begin DoDot:1
 +11               SET DATA=$GET(^HL(772,Y,"IN",SUBIEN,0))
                   IF DATA=""
                       Begin DoDot:2
 +12                       SET DONE=1
 +13                       SET SUBIEN=$ORDER(^HL(772,Y,"IN",SUBIEN))
                           if 'SUBIEN
                               QUIT 
 +14                       SET X=$GET(^HL(772,Y,"IN",SUBIEN,0))
                           SET X=$SELECT($EXTRACT(X,1,3)="MSA":$EXTRACT(X,5,999),1:"")
                       End DoDot:2
               End DoDot:1
               if DONE
                   QUIT 
 +15      ; patch HL*1.6*122 end
 +16      ;
 +17       QUIT X
 +18      ;
ERROR     ;error trap
 +1        DO ^%ZTER
 +2        IF $GET(HLMTIENS)
               IF $DATA(^HLMA(HLMTIENS,0))
                   DO STATUS^HLTF0(HLMTIENS,4,,,1)
                   DO EXIT
 +3       ; release locks created by inbound filer
 +4       ; patch HL*1.6*140
 +5       ; L -^HLMA("AC","I",+$G(HLXX))
 +6        LOCK -^HLMA("IN-FILER","AC","I",+$GET(HLXX))
 +7        GOTO UNWIND^%ZTER
 +8       ;
 +9       ;
EXIT      ;unlock
 +1        IF $GET(HLMTIENS)
               LOCK -^HLMA(HLMTIENS)
 +2        QUIT 
 +3       ;
ONAC(IEN773) ;
 +1       ;Returns 1 if the message is on the "AC","I" xref
 +2       ;Returns 0 otherwise
 +3       ;
 +4        NEW LINK
 +5        SET LINK=$PIECE($GET(^HLMA(IEN773,0)),"^",17)
 +6        if 'LINK
               QUIT 0
 +7        QUIT $DATA(^HLMA("AC","I",LINK,IEN773))