HLCSHDR1 ;SFIRMFO/RSD - Make HL7 header for TCP ;04/17/2007
;;1.6;HEALTH LEVEL SEVEN;**19,57,59,72,80,93,120,133,122**;Oct 13, 1995;Build 14
;Per VHA Directive 2004-038, this routine should not be modified.
;
;Input : IEN - Pointer to entry in Message Administration file (#773)
; that HL7 MSH segment is being built for
; CLIENT - IEN of the receiving application
; HLERROR - Variable to return possible error text in
; (pass by reference - only used when needed)
;
;Output : HLHDR(1) - HL7 MSH segment
; HLHDR(2) - Continuation of HL7 MSH segment (if needed)
; HLHDR(3) - Continuation of HL7 MSH segment (if needed)
;
;Notes : HLERROR will only be defined [on output] if an error occurs
; : HLHDR() will not be defined [on output] if an error occurs
; : HLHDR(2) & HLHDR(3) are continuation [or roll-over] nodes
; and will only be used/defined when needed
;
N ACKTO,ACCACK,APPACK,CHILD,CLNTAPP,CLNTFAC,CNTRY,EC,EVNTYPE,FS,HLDATE,HLHDRI,HLHDRL,HLID,HLPID,MSGTYPE,PROT,PROTS,SECURITY,SEND,SERAPP,SERFAC,TXTP,TXTP0,X,MSGEVN
N COMFLAG ; patch HL*1.6*120
S HLERROR=""
S HLPARAM=$$PARAM^HLCS2
D VAR Q:$G(HLERROR)]""
; The following line commented by HL*1.6*72
;I $D(^HLMA(IEN)) S $P(^HLMA(IEN,0),U,13)=MSGTYPE,$P(^HLMA(IEN,0),U,14)=$G(EVNTYPE)
;Append event type
I $G(EVNTYPE)]"" S MSGTYPE=MSGTYPE_$E(EC,1)_EVNTYPE
;Append message structure component
I $G(EVNTYPE)]"",$G(MSGEVN)]"" S MSGTYPE=MSGTYPE_$E(EC,1)_MSGEVN
;Build MSH array
D RESET^HLCSHDR3 ;HL*1.6*93
;
; patch HL*1.6*120 start
; escape delimiters for SERAPP and CLNTAPP
; escape component separator if the field is not consisted
; of 3 components
S EC(1)=$E(EC,1)
S EC(2)=$E(EC,2)
S EC(3)=$E(EC,3)
S EC(4)=$E(EC,4)
S COMFLAG=1
I $L(SERAPP,$E(EC,1))=3 S COMFLAG=0
I (SERAPP[FS)!(SERAPP[EC(1))!(SERAPP[EC(2))!(SERAPP[EC(3))!(SERAPP[EC(4)) D
. S SERAPP=$$ESCAPE(SERAPP,COMFLAG)
S COMFLAG=1
I $L(CLNTAPP,$E(EC,1))=3 S COMFLAG=0
I (CLNTAPP[FS)!(CLNTAPP[EC(1))!(CLNTAPP[EC(2))!(CLNTAPP[EC(3))!(CLNTAPP[EC(4)) D
. S CLNTAPP=$$ESCAPE(CLNTAPP,COMFLAG)
; patch HL*1.6*120 end
;
S HLHDRI=1,HLHDR(1)="MSH"_FS_EC_FS_SERAPP,HLHDRL=$L(HLHDR(1))
F X=SERFAC,CLNTAPP,CLNTFAC,HLDATE,SECURITY,MSGTYPE,HLID,HLPID,$P(PROT,U,9),"",$G(^HL(772,TXTP,1)),ACCACK,APPACK,CNTRY D MSH(X)
;in preceeding line, "" is for sequence number - not supported
Q
;
MSH(X) ;add X to HLHDR
S:HLHDRL+$L(X)>245 HLHDRI=HLHDRI+1,HLHDR(HLHDRI)=""
S HLHDR(HLHDRI)=HLHDR(HLHDRI)_FS_X,HLHDRL=$L(HLHDR(HLHDRI))
Q
BHSHDR(IEN,CLIENT,HLERROR) ; Create Batch Header Segment
; The BHS has 12 segments, of which 4 are blank.
; INPUT: IEN - IEN of entry in file #772
; OUTPUT: HLHDR(1) and HLHDR(2) - the two lines with the 12 segs.
; ready for adding to a message directly.
N ACKTO,ACCACK,ACKMID,APPACK,BNAME,BSTATUS,BTACK,CHILD,CLNTAPP ;HL*1.6*80
N CLNTFAC,CNTRY,EC,EVNTYPE,FS,HLDATE,HLHDRI,HLHDRL,HLID,HLPID ;HL*1.6*80 - added HLPID
N PROT,PROTS,SECURITY,SEND,SERAPP,SERFAC,TXTP,TXTP0,X ;HL*1.6*80
N COMFLAG ; patch HL*1.6*120
S HLERROR=""
;
S HLPARAM=$$PARAM^HLCS2
D VAR Q:$G(HLERROR)]""
; The following line commented by HL*1.6*72
;I $D(^HLMA(IEN)) S $P(^HLMA(IEN,0),U,13)=MSGTYPE,$P(^HLMA(IEN,0),U,14)=$G(EVNTYPE)
;
;Append event type
I $G(EVNTYPE)]"" S MSGTYPE=MSGTYPE_$E(EC,2)_EVNTYPE,(ACKMID,BTACK)=""
;batch/name/id/type(#9)=null~process ID~msg type|evnt type~version~CA~AA
S BNAME=$E(EC,1)_HLPID_$E(EC,1)_MSGTYPE_$E(EC,1)_$P(PROT,U,9)_$E(EC,1)_ACCACK_$E(EC,1)_APPACK ;HL*1.6*80
;for batch ACK
I ACKTO D S BTACK=X_$E(EC,1)_$P(BSTATUS,U,3)
. ;get msg id and status of message that is being ACKed
. S ACKMID=$P($G(^HLMA(ACKTO,0)),U,2),BSTATUS=$G(^HLMA(ACKTO,"P")) ;HL*1.6*80
. ;set type of ACK based on status
. S X=$S(ACKMID="":"AR",(BSTATUS>3)&(BSTATUS<8):"AE",1:"AA")
;
D RESET^HLCSHDR3 ;HL*1.6*93
;
; patch HL*1.6*120 start
; escape delimiters for SERAPP and CLNTAPP
; escape component separator if the field is not consisted
; of 3 components
S EC(1)=$E(EC,1)
S EC(2)=$E(EC,2)
S EC(3)=$E(EC,3)
S EC(4)=$E(EC,4)
S COMFLAG=1
I $L(SERAPP,$E(EC,1))=3 S COMFLAG=0
I (SERAPP[FS)!(SERAPP[EC(1))!(SERAPP[EC(2))!(SERAPP[EC(3))!(SERAPP[EC(4)) D
. S SERAPP=$$ESCAPE(SERAPP,COMFLAG)
S COMFLAG=1
I $L(CLNTAPP,$E(EC,1))=3 S COMFLAG=0
I (CLNTAPP[FS)!(CLNTAPP[EC(1))!(CLNTAPP[EC(2))!(CLNTAPP[EC(3))!(CLNTAPP[EC(4)) D
. S CLNTAPP=$$ESCAPE(CLNTAPP,COMFLAG)
; patch HL*1.6*120 end
;
S HLHDRI=1,HLHDR(1)="BHS"_FS_EC_FS_SERAPP,HLHDRL=$L(HLHDR(1))
F X=SERFAC,CLNTAPP,CLNTFAC,HLDATE,SECURITY,BNAME,BTACK,HLID,ACKMID D MSH(X)
Q
VAR ;Check input
N APPPRM,HLPROTS,HLPROT
S IEN=+$G(IEN)
I '$G(^HLMA(IEN,0)) S HLERROR="Valid pointer to Message Administration file (#772) not passed" Q
I '$G(CLIENT) S HLERROR="Could not determine receiving application" Q
;Get child, text pointer,text entry, and sending app.
S CHILD=$G(^HLMA(IEN,0)),SEND=+$P($G(^(0)),U,11),TXTP=+CHILD,TXTP0=$G(^HL(772,TXTP,0))
I ('SEND) S HLERROR="Could not determine sending application" Q
;Get info for sending & receiving applications
D APPPRM^HLUTIL2(CLIENT),APPPRM^HLUTIL2(SEND)
;Get name of sending application, facility, and country
S SERAPP=$P(APPPRM(SEND,0),U),SERFAC=$P(APPPRM(SEND,0),U,2),CNTRY=$P(APPPRM(SEND,0),U,3)
;Get name of receiving application and facility
S CLNTAPP=$P(APPPRM(CLIENT,0),U),CLNTFAC=$P(APPPRM(CLIENT,0),U,2)
;
; patch HL*1.6*120
; for dynamic addressing, overide the receiving facility from the
; 3rd component of HLL("LINKS") array
I $G(HLP("REC-FACILITY"))]"" S CLNTFAC=HLP("REC-FACILITY")
;
;Get field separator & encoding characters
S FS=APPPRM(SEND,"FS"),EC=APPPRM(SEND,"EC")
S:(EC="") EC="~|\&" S:(FS="") FS="^"
;Determine if it's a response/ACK to another message
S ACKTO=+$P(CHILD,U,10)
;subscriber protocol is from child (file 773)
;If response, get MType from subscriber
S HLPROTS=+$P(CHILD,U,8)
S PROTS=$$TYPE^HLUTIL2(HLPROTS)
I ACKTO S MSGTYPE=$P(PROTS,U,10),EVNTYPE=$P(PROTS,U,3),MSGEVN=$P(PROTS,U,4)
;Get accept ack & application ack type (based on server protocol) it
; is always in file 772, TXPT0
;If original message, get MT from Event Driver Protocol
S HLPROT=+$P(TXTP0,U,10)
S PROT=$$TYPE^HLUTIL2(HLPROT)
S:'ACKTO MSGTYPE=$P(PROT,U,2),EVNTYPE=$P(PROT,U,3),MSGEVN=$P(PROT,U,4)
S ACCACK=$P(PROT,U,7),APPACK=$P(PROT,U,8)
;
; patch HL*1.6*122
; setting the MSH-15 and MSH-16 from subscriber protocol
I HLPROTS,$P($G(^ORD(101,HLPROTS,773)),"^",5) D
. S ACCACK=$P(PROTS,U,7)
. S APPACK=$P(PROTS,U,8)
;
PID ;Processing ID
;I PID not 'debug' get from site params
;If event driver set to 'debug' get from protocol
;'production' or 'training' comes from site params
S HLPID=$P(PROT,U,5)
I $G(HLPID)'="D" S HLPID=$P(HLPARAM,U,3)
;
; patch HL*1.6*120: to include processing mode
I $G(HLP("PMOD"))]"",($G(HLTYPE)="M") D
. S HLPID=HLPID_$E($G(EC),1)_HLP("PMOD")
;
I $G(HLPID)="" S HLERROR="Missing processing ID Site parameter."
;acknowledgements have no application ack, link open no commit ack
I ACKTO S:APPACK]"" APPACK="NE" S:ACCACK]""&$G(HLTCPO) ACCACK="NE"
;Get date/time, Message ID, and security
S HLDATE=+TXTP0,HLDATE=$$FMTHL7^XLFDT(HLDATE),HLID=$P(CHILD,U,2),SECURITY=$P(CHILD,U,9)
HDR23 ;generate extended facility field info based on 'facility required'
;default format is INSTITUTION_HLCS_DOMAIN_HLCS_'DNS'
;application parameter entry overrides default
N HLEP773,HLS773
S SERFAC=$G(SERFAC),CLNTFAC=$G(CLNTFAC)
S HLEP773=+$G(^ORD(101,HLPROTS,773))
S HLS773=+$P($G(^ORD(101,HLPROTS,773)),U,2)
Q:'HLEP773&('HLS773)
D GEN^HLCSHDR2
I ACKTO D Q
.;Find original message
.S X=$G(^HLMA(ACKTO,"MSH",1,0)) ;Find header in TCP nodes
.I X["MSH" D
..;
..; patch HL*1.6*120 start
.. N HLEC
..S HLFS=$E(X,4),HLEC=$E(X,5)
..S SENDFAC=$P(X,HLFS,4),RECFAC=$P(X,HLFS,6) ;from original msg
..S CLNTFAC=SENDFAC,SERFAC=RECFAC ;reverse facility info
..S EC("COMPONENT")=$E($G(EC),1)
..I $L(EC("COMPONENT"))=1,$L(HLEC)=1,EC("COMPONENT")'=HLEC D
... ; change the the component separator in the sending and
... ; receiving facilities for the outgoing message
... S CLNTFAC=$TR(CLNTFAC,HLEC,EC("COMPONENT"))
... S SERFAC=$TR(SERFAC,HLEC,EC("COMPONENT"))
; patch HL*1.6*120 end
;
I HLEP773,SERFAC="" D EP^HLCSHDR2
I HLS773,CLNTFAC="" D S^HLCSHDR2
Q
;
ESCAPE(INPUT,COMPONET) ;
; patch HL*1.6*120 - escape delimiters:
; - field separator
; - component separator
; - repetition separator
; - escape character
; - subcomponent separator
;
; input:
; INPUT - string data to be escaped
; COMPONET - if 1, escape component separator
; if 0, do not escape component separator
; FS - field separator character
; EC - encoding characters
; result: return the escaped string
;
N HLDATA,HLESCAPE,HLI,HLCHAR,HLEN,HLOUT,COMFLAG
S HLDATA=$G(INPUT)
S COMFLAG=$G(COMPONET)
Q:$L($G(FS))'=1 HLDATA
;
; patch HL*1.6*133
; Q:$L($G(EC))'=4 HLDATA
Q:($L($G(EC))<3) HLDATA
Q:HLDATA']"" HLDATA
;
S HLESCAPE=FS_EC
S HLESCAPE("F")=FS
S HLESCAPE("S")=$E(EC,1)
S HLESCAPE("R")=$E(EC,2)
S HLESCAPE("E")=$E(EC,3)
S HLESCAPE("T")=$E(EC,4)
S HLEN=$L(HLDATA)
S HLOUT=""
F HLI=1:1:HLEN D
. S HLCHAR=$E(HLDATA,HLI)
. I HLESCAPE[HLCHAR D Q
.. I HLCHAR=HLESCAPE("F") S HLOUT=HLOUT_HLESCAPE("E")_"F"_HLESCAPE("E") Q
.. I HLCHAR=HLESCAPE("S") D Q
... I COMFLAG=1 S HLOUT=HLOUT_HLESCAPE("E")_"S"_HLESCAPE("E") Q
... S HLOUT=HLOUT_HLCHAR
.. I HLCHAR=HLESCAPE("R") S HLOUT=HLOUT_HLESCAPE("E")_"R"_HLESCAPE("E") Q
.. I HLCHAR=HLESCAPE("E") S HLOUT=HLOUT_HLESCAPE("E")_"E"_HLESCAPE("E") Q
.. I HLCHAR=HLESCAPE("T") S HLOUT=HLOUT_HLESCAPE("E")_"T"_HLESCAPE("E") Q
. ;
. S HLOUT=HLOUT_HLCHAR
Q HLOUT
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HHLCSHDR1 10001 printed Sep 02, 2024@18:41:54 Page 2
HLCSHDR1 ;SFIRMFO/RSD - Make HL7 header for TCP ;04/17/2007
+1 ;;1.6;HEALTH LEVEL SEVEN;**19,57,59,72,80,93,120,133,122**;Oct 13, 1995;Build 14
+2 ;Per VHA Directive 2004-038, this routine should not be modified.
+1 ;
+2 ;Input : IEN - Pointer to entry in Message Administration file (#773)
+3 ; that HL7 MSH segment is being built for
+4 ; CLIENT - IEN of the receiving application
+5 ; HLERROR - Variable to return possible error text in
+6 ; (pass by reference - only used when needed)
+7 ;
+8 ;Output : HLHDR(1) - HL7 MSH segment
+9 ; HLHDR(2) - Continuation of HL7 MSH segment (if needed)
+10 ; HLHDR(3) - Continuation of HL7 MSH segment (if needed)
+11 ;
+12 ;Notes : HLERROR will only be defined [on output] if an error occurs
+13 ; : HLHDR() will not be defined [on output] if an error occurs
+14 ; : HLHDR(2) & HLHDR(3) are continuation [or roll-over] nodes
+15 ; and will only be used/defined when needed
+16 ;
+17 NEW ACKTO,ACCACK,APPACK,CHILD,CLNTAPP,CLNTFAC,CNTRY,EC,EVNTYPE,FS,HLDATE,HLHDRI,HLHDRL,HLID,HLPID,MSGTYPE,PROT,PROTS,SECURITY,SEND,SERAPP,SERFAC,TXTP,TXTP0,X,MSGEVN
+18 ; patch HL*1.6*120
NEW COMFLAG
+19 SET HLERROR=""
+20 SET HLPARAM=$$PARAM^HLCS2
+21 DO VAR
if $GET(HLERROR)]""
QUIT
+22 ; The following line commented by HL*1.6*72
+23 ;I $D(^HLMA(IEN)) S $P(^HLMA(IEN,0),U,13)=MSGTYPE,$P(^HLMA(IEN,0),U,14)=$G(EVNTYPE)
+24 ;Append event type
+25 IF $GET(EVNTYPE)]""
SET MSGTYPE=MSGTYPE_$EXTRACT(EC,1)_EVNTYPE
+26 ;Append message structure component
+27 IF $GET(EVNTYPE)]""
IF $GET(MSGEVN)]""
SET MSGTYPE=MSGTYPE_$EXTRACT(EC,1)_MSGEVN
+28 ;Build MSH array
+29 ;HL*1.6*93
DO RESET^HLCSHDR3
+30 ;
+31 ; patch HL*1.6*120 start
+32 ; escape delimiters for SERAPP and CLNTAPP
+33 ; escape component separator if the field is not consisted
+34 ; of 3 components
+35 SET EC(1)=$EXTRACT(EC,1)
+36 SET EC(2)=$EXTRACT(EC,2)
+37 SET EC(3)=$EXTRACT(EC,3)
+38 SET EC(4)=$EXTRACT(EC,4)
+39 SET COMFLAG=1
+40 IF $LENGTH(SERAPP,$EXTRACT(EC,1))=3
SET COMFLAG=0
+41 IF (SERAPP[FS)!(SERAPP[EC(1))!(SERAPP[EC(2))!(SERAPP[EC(3))!(SERAPP[EC(4))
Begin DoDot:1
+42 SET SERAPP=$$ESCAPE(SERAPP,COMFLAG)
End DoDot:1
+43 SET COMFLAG=1
+44 IF $LENGTH(CLNTAPP,$EXTRACT(EC,1))=3
SET COMFLAG=0
+45 IF (CLNTAPP[FS)!(CLNTAPP[EC(1))!(CLNTAPP[EC(2))!(CLNTAPP[EC(3))!(CLNTAPP[EC(4))
Begin DoDot:1
+46 SET CLNTAPP=$$ESCAPE(CLNTAPP,COMFLAG)
End DoDot:1
+47 ; patch HL*1.6*120 end
+48 ;
+49 SET HLHDRI=1
SET HLHDR(1)="MSH"_FS_EC_FS_SERAPP
SET HLHDRL=$LENGTH(HLHDR(1))
+50 FOR X=SERFAC,CLNTAPP,CLNTFAC,HLDATE,SECURITY,MSGTYPE,HLID,HLPID,$PIECE(PROT,U,9),"",$GET(^HL(772,TXTP,1)),ACCACK,APPACK,CNTRY
DO MSH(X)
+51 ;in preceeding line, "" is for sequence number - not supported
+52 QUIT
+53 ;
MSH(X) ;add X to HLHDR
+1 if HLHDRL+$LENGTH(X)>245
SET HLHDRI=HLHDRI+1
SET HLHDR(HLHDRI)=""
+2 SET HLHDR(HLHDRI)=HLHDR(HLHDRI)_FS_X
SET HLHDRL=$LENGTH(HLHDR(HLHDRI))
+3 QUIT
BHSHDR(IEN,CLIENT,HLERROR) ; Create Batch Header Segment
+1 ; The BHS has 12 segments, of which 4 are blank.
+2 ; INPUT: IEN - IEN of entry in file #772
+3 ; OUTPUT: HLHDR(1) and HLHDR(2) - the two lines with the 12 segs.
+4 ; ready for adding to a message directly.
+5 ;HL*1.6*80
NEW ACKTO,ACCACK,ACKMID,APPACK,BNAME,BSTATUS,BTACK,CHILD,CLNTAPP
+6 ;HL*1.6*80 - added HLPID
NEW CLNTFAC,CNTRY,EC,EVNTYPE,FS,HLDATE,HLHDRI,HLHDRL,HLID,HLPID
+7 ;HL*1.6*80
NEW PROT,PROTS,SECURITY,SEND,SERAPP,SERFAC,TXTP,TXTP0,X
+8 ; patch HL*1.6*120
NEW COMFLAG
+9 SET HLERROR=""
+10 ;
+11 SET HLPARAM=$$PARAM^HLCS2
+12 DO VAR
if $GET(HLERROR)]""
QUIT
+13 ; The following line commented by HL*1.6*72
+14 ;I $D(^HLMA(IEN)) S $P(^HLMA(IEN,0),U,13)=MSGTYPE,$P(^HLMA(IEN,0),U,14)=$G(EVNTYPE)
+15 ;
+16 ;Append event type
+17 IF $GET(EVNTYPE)]""
SET MSGTYPE=MSGTYPE_$EXTRACT(EC,2)_EVNTYPE
SET (ACKMID,BTACK)=""
+18 ;batch/name/id/type(#9)=null~process ID~msg type|evnt type~version~CA~AA
+19 ;HL*1.6*80
SET BNAME=$EXTRACT(EC,1)_HLPID_$EXTRACT(EC,1)_MSGTYPE_$EXTRACT(EC,1)_$PIECE(PROT,U,9)_$EXTRACT(EC,1)_ACCACK_$EXTRACT(EC,1)_APPACK
+20 ;for batch ACK
+21 IF ACKTO
Begin DoDot:1
+22 ;get msg id and status of message that is being ACKed
+23 ;HL*1.6*80
SET ACKMID=$PIECE($GET(^HLMA(ACKTO,0)),U,2)
SET BSTATUS=$GET(^HLMA(ACKTO,"P"))
+24 ;set type of ACK based on status
+25 SET X=$SELECT(ACKMID="":"AR",(BSTATUS>3)&(BSTATUS<8):"AE",1:"AA")
End DoDot:1
SET BTACK=X_$EXTRACT(EC,1)_$PIECE(BSTATUS,U,3)
+26 ;
+27 ;HL*1.6*93
DO RESET^HLCSHDR3
+28 ;
+29 ; patch HL*1.6*120 start
+30 ; escape delimiters for SERAPP and CLNTAPP
+31 ; escape component separator if the field is not consisted
+32 ; of 3 components
+33 SET EC(1)=$EXTRACT(EC,1)
+34 SET EC(2)=$EXTRACT(EC,2)
+35 SET EC(3)=$EXTRACT(EC,3)
+36 SET EC(4)=$EXTRACT(EC,4)
+37 SET COMFLAG=1
+38 IF $LENGTH(SERAPP,$EXTRACT(EC,1))=3
SET COMFLAG=0
+39 IF (SERAPP[FS)!(SERAPP[EC(1))!(SERAPP[EC(2))!(SERAPP[EC(3))!(SERAPP[EC(4))
Begin DoDot:1
+40 SET SERAPP=$$ESCAPE(SERAPP,COMFLAG)
End DoDot:1
+41 SET COMFLAG=1
+42 IF $LENGTH(CLNTAPP,$EXTRACT(EC,1))=3
SET COMFLAG=0
+43 IF (CLNTAPP[FS)!(CLNTAPP[EC(1))!(CLNTAPP[EC(2))!(CLNTAPP[EC(3))!(CLNTAPP[EC(4))
Begin DoDot:1
+44 SET CLNTAPP=$$ESCAPE(CLNTAPP,COMFLAG)
End DoDot:1
+45 ; patch HL*1.6*120 end
+46 ;
+47 SET HLHDRI=1
SET HLHDR(1)="BHS"_FS_EC_FS_SERAPP
SET HLHDRL=$LENGTH(HLHDR(1))
+48 FOR X=SERFAC,CLNTAPP,CLNTFAC,HLDATE,SECURITY,BNAME,BTACK,HLID,ACKMID
DO MSH(X)
+49 QUIT
VAR ;Check input
+1 NEW APPPRM,HLPROTS,HLPROT
+2 SET IEN=+$GET(IEN)
+3 IF '$GET(^HLMA(IEN,0))
SET HLERROR="Valid pointer to Message Administration file (#772) not passed"
QUIT
+4 IF '$GET(CLIENT)
SET HLERROR="Could not determine receiving application"
QUIT
+5 ;Get child, text pointer,text entry, and sending app.
+6 SET CHILD=$GET(^HLMA(IEN,0))
SET SEND=+$PIECE($GET(^(0)),U,11)
SET TXTP=+CHILD
SET TXTP0=$GET(^HL(772,TXTP,0))
+7 IF ('SEND)
SET HLERROR="Could not determine sending application"
QUIT
+8 ;Get info for sending & receiving applications
+9 DO APPPRM^HLUTIL2(CLIENT)
DO APPPRM^HLUTIL2(SEND)
+10 ;Get name of sending application, facility, and country
+11 SET SERAPP=$PIECE(APPPRM(SEND,0),U)
SET SERFAC=$PIECE(APPPRM(SEND,0),U,2)
SET CNTRY=$PIECE(APPPRM(SEND,0),U,3)
+12 ;Get name of receiving application and facility
+13 SET CLNTAPP=$PIECE(APPPRM(CLIENT,0),U)
SET CLNTFAC=$PIECE(APPPRM(CLIENT,0),U,2)
+14 ;
+15 ; patch HL*1.6*120
+16 ; for dynamic addressing, overide the receiving facility from the
+17 ; 3rd component of HLL("LINKS") array
+18 IF $GET(HLP("REC-FACILITY"))]""
SET CLNTFAC=HLP("REC-FACILITY")
+19 ;
+20 ;Get field separator & encoding characters
+21 SET FS=APPPRM(SEND,"FS")
SET EC=APPPRM(SEND,"EC")
+22 if (EC="")
SET EC="~|\&"
if (FS="")
SET FS="^"
+23 ;Determine if it's a response/ACK to another message
+24 SET ACKTO=+$PIECE(CHILD,U,10)
+25 ;subscriber protocol is from child (file 773)
+26 ;If response, get MType from subscriber
+27 SET HLPROTS=+$PIECE(CHILD,U,8)
+28 SET PROTS=$$TYPE^HLUTIL2(HLPROTS)
+29 IF ACKTO
SET MSGTYPE=$PIECE(PROTS,U,10)
SET EVNTYPE=$PIECE(PROTS,U,3)
SET MSGEVN=$PIECE(PROTS,U,4)
+30 ;Get accept ack & application ack type (based on server protocol) it
+31 ; is always in file 772, TXPT0
+32 ;If original message, get MT from Event Driver Protocol
+33 SET HLPROT=+$PIECE(TXTP0,U,10)
+34 SET PROT=$$TYPE^HLUTIL2(HLPROT)
+35 if 'ACKTO
SET MSGTYPE=$PIECE(PROT,U,2)
SET EVNTYPE=$PIECE(PROT,U,3)
SET MSGEVN=$PIECE(PROT,U,4)
+36 SET ACCACK=$PIECE(PROT,U,7)
SET APPACK=$PIECE(PROT,U,8)
+37 ;
+38 ; patch HL*1.6*122
+39 ; setting the MSH-15 and MSH-16 from subscriber protocol
+40 IF HLPROTS
IF $PIECE($GET(^ORD(101,HLPROTS,773)),"^",5)
Begin DoDot:1
+41 SET ACCACK=$PIECE(PROTS,U,7)
+42 SET APPACK=$PIECE(PROTS,U,8)
End DoDot:1
+43 ;
PID ;Processing ID
+1 ;I PID not 'debug' get from site params
+2 ;If event driver set to 'debug' get from protocol
+3 ;'production' or 'training' comes from site params
+4 SET HLPID=$PIECE(PROT,U,5)
+5 IF $GET(HLPID)'="D"
SET HLPID=$PIECE(HLPARAM,U,3)
+6 ;
+7 ; patch HL*1.6*120: to include processing mode
+8 IF $GET(HLP("PMOD"))]""
IF ($GET(HLTYPE)="M")
Begin DoDot:1
+9 SET HLPID=HLPID_$EXTRACT($GET(EC),1)_HLP("PMOD")
End DoDot:1
+10 ;
+11 IF $GET(HLPID)=""
SET HLERROR="Missing processing ID Site parameter."
+12 ;acknowledgements have no application ack, link open no commit ack
+13 IF ACKTO
if APPACK]""
SET APPACK="NE"
if ACCACK]""&$GET(HLTCPO)
SET ACCACK="NE"
+14 ;Get date/time, Message ID, and security
+15 SET HLDATE=+TXTP0
SET HLDATE=$$FMTHL7^XLFDT(HLDATE)
SET HLID=$PIECE(CHILD,U,2)
SET SECURITY=$PIECE(CHILD,U,9)
HDR23 ;generate extended facility field info based on 'facility required'
+1 ;default format is INSTITUTION_HLCS_DOMAIN_HLCS_'DNS'
+2 ;application parameter entry overrides default
+3 NEW HLEP773,HLS773
+4 SET SERFAC=$GET(SERFAC)
SET CLNTFAC=$GET(CLNTFAC)
+5 SET HLEP773=+$GET(^ORD(101,HLPROTS,773))
+6 SET HLS773=+$PIECE($GET(^ORD(101,HLPROTS,773)),U,2)
+7 if 'HLEP773&('HLS773)
QUIT
+8 DO GEN^HLCSHDR2
+9 IF ACKTO
Begin DoDot:1
+10 ;Find original message
+11 ;Find header in TCP nodes
SET X=$GET(^HLMA(ACKTO,"MSH",1,0))
+12 IF X["MSH"
Begin DoDot:2
+13 ;
+14 ; patch HL*1.6*120 start
+15 NEW HLEC
+16 SET HLFS=$EXTRACT(X,4)
SET HLEC=$EXTRACT(X,5)
+17 ;from original msg
SET SENDFAC=$PIECE(X,HLFS,4)
SET RECFAC=$PIECE(X,HLFS,6)
+18 ;reverse facility info
SET CLNTFAC=SENDFAC
SET SERFAC=RECFAC
+19 SET EC("COMPONENT")=$EXTRACT($GET(EC),1)
+20 IF $LENGTH(EC("COMPONENT"))=1
IF $LENGTH(HLEC)=1
IF EC("COMPONENT")'=HLEC
Begin DoDot:3
+21 ; change the the component separator in the sending and
+22 ; receiving facilities for the outgoing message
+23 SET CLNTFAC=$TRANSLATE(CLNTFAC,HLEC,EC("COMPONENT"))
+24 SET SERFAC=$TRANSLATE(SERFAC,HLEC,EC("COMPONENT"))
End DoDot:3
End DoDot:2
End DoDot:1
QUIT
+25 ; patch HL*1.6*120 end
+26 ;
+27 IF HLEP773
IF SERFAC=""
DO EP^HLCSHDR2
+28 IF HLS773
IF CLNTFAC=""
DO S^HLCSHDR2
+29 QUIT
+30 ;
ESCAPE(INPUT,COMPONET) ;
+1 ; patch HL*1.6*120 - escape delimiters:
+2 ; - field separator
+3 ; - component separator
+4 ; - repetition separator
+5 ; - escape character
+6 ; - subcomponent separator
+7 ;
+8 ; input:
+9 ; INPUT - string data to be escaped
+10 ; COMPONET - if 1, escape component separator
+11 ; if 0, do not escape component separator
+12 ; FS - field separator character
+13 ; EC - encoding characters
+14 ; result: return the escaped string
+15 ;
+16 NEW HLDATA,HLESCAPE,HLI,HLCHAR,HLEN,HLOUT,COMFLAG
+17 SET HLDATA=$GET(INPUT)
+18 SET COMFLAG=$GET(COMPONET)
+19 if $LENGTH($GET(FS))'=1
QUIT HLDATA
+20 ;
+21 ; patch HL*1.6*133
+22 ; Q:$L($G(EC))'=4 HLDATA
+23 if ($LENGTH($GET(EC))<3)
QUIT HLDATA
+24 if HLDATA']""
QUIT HLDATA
+25 ;
+26 SET HLESCAPE=FS_EC
+27 SET HLESCAPE("F")=FS
+28 SET HLESCAPE("S")=$EXTRACT(EC,1)
+29 SET HLESCAPE("R")=$EXTRACT(EC,2)
+30 SET HLESCAPE("E")=$EXTRACT(EC,3)
+31 SET HLESCAPE("T")=$EXTRACT(EC,4)
+32 SET HLEN=$LENGTH(HLDATA)
+33 SET HLOUT=""
+34 FOR HLI=1:1:HLEN
Begin DoDot:1
+35 SET HLCHAR=$EXTRACT(HLDATA,HLI)
+36 IF HLESCAPE[HLCHAR
Begin DoDot:2
+37 IF HLCHAR=HLESCAPE("F")
SET HLOUT=HLOUT_HLESCAPE("E")_"F"_HLESCAPE("E")
QUIT
+38 IF HLCHAR=HLESCAPE("S")
Begin DoDot:3
+39 IF COMFLAG=1
SET HLOUT=HLOUT_HLESCAPE("E")_"S"_HLESCAPE("E")
QUIT
+40 SET HLOUT=HLOUT_HLCHAR
End DoDot:3
QUIT
+41 IF HLCHAR=HLESCAPE("R")
SET HLOUT=HLOUT_HLESCAPE("E")_"R"_HLESCAPE("E")
QUIT
+42 IF HLCHAR=HLESCAPE("E")
SET HLOUT=HLOUT_HLESCAPE("E")_"E"_HLESCAPE("E")
QUIT
+43 IF HLCHAR=HLESCAPE("T")
SET HLOUT=HLOUT_HLESCAPE("E")_"T"_HLESCAPE("E")
QUIT
End DoDot:2
QUIT
+44 ;
+45 SET HLOUT=HLOUT_HLCHAR
End DoDot:1
+46 QUIT HLOUT