Ignore:
Timestamp:
Dec 4, 2009, 12:11:15 AM (14 years ago)
Author:
George Lilly
Message:

revised back to 6/30/08 version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • WorldVistAEHR/trunk/r/HEALTH_LEVEL_SEVEN-HL/HLTP3.m

    r613 r623  
    1 HLTP3   ;SFIRMFO/RSD - Transaction Processor for TCP ;03/17/2008  11:26
    2         ;;1.6;HEALTH LEVEL SEVEN;**19,43,57,58,59,66,69,109,115,108,116,117,125,120,133,122,140**;Oct 13, 1995;Build 5
    3         ;Per VHA Directive 2004-038, this routine should not be modified.
    4         ;
    5         Q
    6 NEW(X)  ;process new msg. ien in 773^ien in 772
    7         ;HLMTIENS=ien in #773; HLMTIEN=ien in #772
    8         ;HLHDRO=original header;  HLHDR=response header
    9         ;set error trap
    10         N $ETRAP,$ESTACK S $ETRAP="D ERROR^HLTP3"
    11         N HL,HLEID,HLEIDS,HLERR,HLHDR,HLHDRO,HLMTIEN,HLMTIENS,HLJ,HLMSA,HLQUIT,HLNODE,HLNEXT,HLRESLTA,HLDONE1,HLASTRSP,HLRESLT
    12         S HLRESLT=""
    13         D INIT^HLTP3A
    14         ;error with header, return commit/app reject
    15         I $G(HLRESLT) D  Q
    16         . ;set status & unlock record
    17         . D STATUS^HLTF0(HLMTIENS,4,,,1),EXIT
    18         . ;quit if no commit or app ack
    19         . I $G(HL("ACAT"))="NE",$G(HL("APAT"))="NE" Q
    20         . S X=$S($G(HL("ACAT"))="AL":"CR",1:"AR")
    21         . ;HLTCP=ien of acknowledgment msg. from ACK^HLTP4
    22         . D ACK^HLTP4(X,$P(HLRESLT,U,2)) Q:'$G(HLTCP)
    23         . ;write ack back
    24         . S X=$$WRITE^HLCSTCP2(HLTCP)
    25         . ;update counter to sent
    26         . D LLCNT^HLCSTCP(HLDP,4)
    27         . ;update status of ack
    28         . D STATUS^HLTF0(HLTCP,3,,,1)
    29         ;
    30         ;check for duplicate msg., use rec. app and msg. id x-ref
    31         ; patch HL*1.6*120
    32         I $G(HL("MID"))]"",$G(HL("RAP")) S X=$O(^HLMA("AH",HL("RAP"),HL("MID"),0)) D  Q:'$D(HLMTIENS)
    33         . ;HLASTMSG=last ien received during this connection
    34         . ;if no duplicate, save msg. ien and quit
    35         . I X=HLMTIENS!'X S HLASTMSG=HLMTIENS Q
    36         . N MSH,OIENS
    37         . S (OIENS,Y)=X D  S Y=HLMTIENS D
    38         .. ;combine MSH into single string
    39         .. S MSH(Y)="",I=0 F  S I=$O(^HLMA(Y,"MSH",I)) Q:'I  S MSH(Y)=MSH(Y)_$G(^(I,0))
    40         .; patch 117 & 125, check if identical
    41         .I MSH(HLMTIENS)'=MSH(OIENS) S HLASTMSG=HLMTIENS Q
    42         .;
    43         . ;msg is duplicate, set status
    44         . D STATUS^HLTF0(HLMTIENS,4,109,"Duplicate with ien "_OIENS,1),EXIT
    45         . ;msg was resent, ignore it.
    46         . I HLASTMSG=HLMTIENS K HLMTIENS Q
    47         . ;find original response and send back
    48         . S HLASTRSP=$O(^HLMA("AF",OIENS,OIENS))
    49         ;
    50         ;Quit if this is ack to ack
    51         I $G(HL("ACK")) D  Q
    52         . ;Update status of original ack message
    53         . D STATUS^HLTF0(HL("MTIENS"),3,,,1),STATUS^HLTF0(HLMTIENS,3,,,1)
    54         . ;unlock record
    55         . D EXIT
    56         ;
    57         ;enhance ack., send commit, quit if not an ack, msg will be processed by filer
    58         I $G(HL("ACAT"))="AL" D  Q:'$G(HL("MTIENS"))
    59         . ;msg is a resend, HLASTRSP=ien of original response
    60         .I $G(HLASTRSP) D
    61         ..S HLTCP=HLASTRSP
    62         ..D LLCNT^HLCSTCP(HLDP,3)
    63         . E  D  Q:'$G(HLTCP)
    64         ..D ACK^HLTP4("CA") ;**109** LLCNT^HLCSTCP(HLDP,3) called in ACK^HLTP4
    65         . S X=$$WRITE^HLCSTCP2(HLTCP)
    66         . D LLCNT^HLCSTCP(HLDP,4),STATUS^HLTF0(HLTCP,3,,,1):'$G(HLASTRSP)
    67         . S HLTCP=""
    68         . ;if not an ack, set status to awaiting processing **109** and put on in queue
    69         . I '$G(HL("MTIENS")),'$G(HLASTRSP) D STATUS^HLTF0(HLMTIENS,9),EXIT,SETINQUE^HLTP31
    70         ;
    71         ;enhance ack., no commit & no app ack
    72         I $G(HL("ACAT"))="NE",$G(HL("APAT"))="NE" D  Q
    73         . ;set status to awaiting processing, **109** and put on in queue
    74         . I '$G(HLASTRSP) D STATUS^HLTF0(HLMTIENS,9),EXIT,SETINQUE^HLTP31
    75         ;
    76         ; patch HL*1.6*120 start
    77         ;resending old response, msg is a resend
    78         ; do not re-send duplicate when $G(HL("ACAT"))="AL"
    79         I $G(HLASTRSP),$G(HL("ACAT"))'="AL" S HLTCP=HLASTRSP G ACK
    80         ; quit if duplicate
    81         Q:$G(HLASTRSP)
    82         ; patch HL*1.6*120 end
    83         ;
    84 CONT    ;continue processing an enhance ack msg. called from DEFACK
    85         ;Set special HL variables for processing rtn
    86         S HLQUIT=0,HLNODE="",HLNEXT="D HLNEXT^HLCSUTL"
    87         ;
    88         ; message is an acknowledgement, HLMSA=ack code^id^text
    89         I ($G(HLMSA)]"") D  Q
    90         . ;X=1 if ack ok, 0=reject of error
    91         . S X=$E(HLMSA,2)="A"
    92         . ;Update status of original message and remove it from the queue
    93         . D STATUS^HLTF0(HL("MTIENS"),$S(X:3,1:4),"",$S(X:"",1:$P(HLMSA,HL("FS"),3)),1)
    94         . D DEQUE^HLCSREP($P($G(^HLMA(HL("MTIENS"),0)),"^",7),"O",HL("MTIENS"))
    95         . D
    96         .. N HLTCP ;variable to update status in file #772.
    97         ..;
    98         ..;**108**
    99         .. N TEMP
    100         .. S TEMP=HLMTIENS
    101         .. N HLMTIENS
    102         .. S HLMTIENS=TEMP
    103         ..;**END 108**
    104         ..;
    105         .. D PROCACK^HLTP2(HLMTIEN,HL("EID"),.HLRESLT,.HL)
    106         . ;update status of incoming & unlock
    107         . 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
    108         ;
    109         ;get entry action, exit action and processing routine
    110         K HLHDR,HLLD0,HLLD1,HLMSA
    111         I HL("EIDS")="",$G(HLEIDS)]"" S HL("EIDS")=HLEIDS ;**CIRN**
    112         D EVENT^HLUTIL1(HL("EIDS"),"15,20,771",.HLN)
    113         S HLENROU=$G(HLN(20)),HLEXROU=$G(HLN(15)),HLPROU=$G(HLN(771))
    114         ;quit if no processing routine,update status and quit
    115         I HLPROU']"" S HLRESLT="10^"_$G(^HL(771.7,10,0)) D STATUS^HLTF0(HLMTIENS,3,,,1),EXIT Q
    116         ;HLORNOD=subscriber protocol for Fileman auditing, ien;global ref
    117         N HLORNODD S HLORNOD=HL("EIDS")_";ORD(101,"
    118         ;Execute entry action of client protocol
    119         X:HLENROU]"" HLENROU K HLENROU,HLDONE1
    120         ;
    121         ;Execute processing routine
    122         X HLPROU S HLRESLT=0 S:($D(HLERR)) HLRESLT="9^"_HLERR
    123         ;update status of incoming to complete & unlock
    124         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
    125         ;HLTCPO=link open, HLTCP=ien of ack msg. from GENACK
    126 ACK     I $G(HLTCPO),$G(HLTCP) D  Q
    127         . D LLCNT^HLCSTCP(HLDP,3)
    128         . ;write ack back over open tcp link
    129         . S X=$$WRITE^HLCSTCP2(HLTCP)
    130         . ;update status of ack to complete
    131         . D:'$G(HLASTRSP) STATUS^HLTF0(HLTCP,3,,,1)
    132         . D LLCNT^HLCSTCP(HLDP,4)
    133         Q
    134         ;
    135 DEFACK(HLDP,X)  ;process the deferred application ack, called from HLCSIN
    136         ;HLDP=logical link, X=ien in file 773
    137         ;
    138         ; patch HL*1.6*120 start
    139         ; clean non-Kernel variables
    140         D
    141         . ; protect variables defined in STARTIN^HLCSIN
    142         . N HLFLG,HLEXIT,HLPTRFLR
    143         . ; protect variables defined in DEFACK^HLCSIN
    144         . N HLXX,HLD0,HLPCT
    145         . ; protect input parameters of this sub-routine
    146         . N HLDP,X
    147         . D KILL^XUSCLEAN
    148         ; patch HL*1.6*120 end
    149         ;
    150         ;set error trap
    151         N $ETRAP,$ESTACK S $ETRAP="D ERROR^HLTP3"
    152         N HLERR     ;patch HL*1.6*109
    153         Q:'$G(HLDP)!'$G(X)  Q:'$G(^HLMA(X,0))
    154         Q:'$D(^HLMA("AC","I",HLDP,X))
    155         ;
    156         N HL,HLA,HLD0,HLEID,HLEIDS,HLHDR,HLHDRO,HLMTIEN,HLMTIENS,HLJ,HLMSA,HLN,HLQUIT,HLNODE,HLNEXT,HLRESLT,HLRESLTA,HLTCP,HLXX,Z,HLDONE1
    157         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")=""""""
    158         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)
    159         S:$P(X,U,15) HL("MTP_ETP")=$P(X,U,15)
    160         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)
    161         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)
    162         S:$G(HL("MTP_ETP")) HL("MTN_ETN")=$P($G(^HL(779.005,HL("MTP_ETP"),0)),U)
    163         S HL("EID")=$P($G(^HL(772,HLMTIEN,0)),U,10)
    164         M HLHDRO=^HLMA(HLMTIENS,"MSH")
    165         ; if no header quit
    166         Q:'$O(HLHDRO(0))
    167         ;
    168         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)
    169         ;
    170         ; quit if ien of #772 is not defined
    171         Q:'HLMTIEN
    172         ; quit if field separator is not defined
    173         Q:HL("FS")=""
    174         ;
    175         S X=$$P^HLTPCK2(.HLHDRO,1)
    176         ;
    177         ; patch HL*1.6*120 start
    178         I X="MSH" D
    179         . 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)
    180         . ;
    181         . ; 2nd component is Processing mode
    182         . S HL("PMOD")=$P(HL("PID"),$E(HL("ECH"),1),2)
    183         . ; first component is Processing id
    184         . S HL("PID")=$P(HL("PID"),$E(HL("ECH"),1))
    185         ;
    186         I X'="MSH" D
    187         . S X=$$P^HLTPCK2(.HLHDRO,9),Z=$E(HL("ECH")),HL("PID")=$P(X,Z,2),HL("VER")=$P(X,Z,4)
    188         . ;
    189         . ; original code incorrectly treats repetition separator as
    190         . ; subcomponent separator
    191         . I $E(HL("ECH"),2)]"",X[$E(HL("ECH"),2) D
    192         .. S HL("SUB-COMPONENT")=$E(HL("ECH"),2)
    193         . ; if subcomponent separator is correctly applied
    194         . I $E(HL("ECH"),4)]"",X[$E(HL("ECH"),4) D
    195         .. S HL("SUB-COMPONENT")=$E(HL("ECH"),4)
    196         . ;
    197         . I $D(HL("SUB-COMPONENT")),HL("PID")[HL("SUB-COMPONENT") D
    198         .. ; 2nd sub-component is Processing mode
    199         .. S HL("PMOD")=$P(HL("PID"),HL("SUB-COMPONENT"),2)
    200         .. ; first sub-component is Processing id
    201         .. S HL("PID")=$P(HL("PID"),HL("SUB-COMPONENT"))
    202         . ; patch HL*1.6*120 end
    203         . ;
    204         . Q:$$P^HLTPCK2(.HLHDRO,10)=""
    205         . ;HLMSA=ack code^id^text
    206         . 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)
    207         ;
    208         ; quit if this is a commit ack
    209         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
    210         ;
    211         ;**  HL*1.6*117 **
    212         K HLL("SET FOR APP ACK"),HLL("LINKS")
    213         ;
    214         D CONT
    215         Q
    216         ;
    217 MSA(Y)  ;Y=ien in 772, returns MSA segment
    218         ;ack code^msg being ack id^text
    219         ; patch HL*1.6*122
    220         ; for HL7 v2.5 and beyond with MSA as 3rd segment
    221         N X,SUBIEN,DATA,DONE
    222         S X=$G(^HL(772,Y,"IN",1,0)),X=$S($E(X,1,3)="MSA":$E(X,5,999),1:"")
    223         Q:X]"" X
    224         ;
    225         S DONE=0
    226         S SUBIEN=1
    227         F  S SUBIEN=$O(^HL(772,Y,"IN",SUBIEN)) Q:'SUBIEN  D  Q:DONE
    228         . S DATA=$G(^HL(772,Y,"IN",SUBIEN,0)) I DATA="" D
    229         .. S DONE=1
    230         .. S SUBIEN=$O(^HL(772,Y,"IN",SUBIEN)) Q:'SUBIEN
    231         .. S X=$G(^HL(772,Y,"IN",SUBIEN,0)),X=$S($E(X,1,3)="MSA":$E(X,5,999),1:"")
    232         ; patch HL*1.6*122 end
    233         ;
    234         Q X
    235         ;
    236 ERROR   ;error trap
    237         D ^%ZTER
    238         I $G(HLMTIENS),$D(^HLMA(HLMTIENS,0)) D STATUS^HLTF0(HLMTIENS,4,,,1),EXIT
    239         ; release locks created by inbound filer
    240         ; patch HL*1.6*140
    241         ; L -^HLMA("AC","I",+$G(HLXX))
    242         L -^HLMA("IN-FILER","AC","I",+$G(HLXX))
    243         G UNWIND^%ZTER
    244         ;
    245         ;
    246 EXIT    ;unlock
    247         I $G(HLMTIENS) L -^HLMA(HLMTIENS)
    248         Q
    249         ;
    250 ONAC(IEN773)    ;
    251         ;Returns 1 if the message is on the "AC","I" xref
    252         ;Returns 0 otherwise
    253         ;
    254         N LINK
    255         S LINK=$P($G(^HLMA(IEN773,0)),"^",17)
    256         Q:'LINK 0
    257         Q $D(^HLMA("AC","I",LINK,IEN773))
     1HLTP3 ;SFIRMFO/RSD - Transaction Processor for TCP ;09/13/2006
     2 ;;1.6;HEALTH LEVEL SEVEN;**19,43,57,58,59,66,69,109,115,108,116,117,125,120,133**;Oct 13, 1995;Build 13
     3 ;Per VHA Directive 2004-038, this routine should not be modified.
     4 ;
     5 Q
     6NEW(X) ;process new msg. ien in 773^msg. ien in 772
     7 ;HLMTIENS=ien in #773, msg header; HLMTIEN=ien in #772, msg text
     8 ;HLHDRO=original header;  HLHDR=response header
     9 ;set error trap
     10 N $ETRAP,$ESTACK S $ETRAP="D ERROR^HLTP3"
     11 N HL,HLEID,HLEIDS,HLERR,HLHDR,HLHDRO,HLMTIEN,HLMTIENS,HLJ,HLMSA,HLQUIT,HLNODE,HLNEXT,HLRESLTA,HLDONE1,HLASTRSP,HLRESLT
     12 S HLRESLT=""
     13 D INIT^HLTP3A
     14 ;error with header, return commit/app reject
     15 I $G(HLRESLT) D  Q
     16 . ;set status & unlock record
     17 . D STATUS^HLTF0(HLMTIENS,4,,,1),EXIT
     18 . ;quit if no commit or app ack
     19 . I $G(HL("ACAT"))="NE",$G(HL("APAT"))="NE" Q
     20 . S X=$S($G(HL("ACAT"))="AL":"CR",1:"AR")
     21 . ;HLTCP=ien of acknowledgment msg. from ACK^HLTP4
     22 . D ACK^HLTP4(X,$P(HLRESLT,U,2)) Q:'$G(HLTCP)
     23 . ;write ack back over connection
     24 . S X=$$WRITE^HLCSTCP2(HLTCP)
     25 . ;update counter to sent
     26 . D LLCNT^HLCSTCP(HLDP,4)
     27 . ;update status of ack to complete
     28 . D STATUS^HLTF0(HLTCP,3,,,1)
     29 ;
     30 ;check for duplicate msg., use rec. app and msg. id x-ref
     31 ; patch HL*1.6*120
     32 ; I $L($G(HL("MID"))),$G(HL("RAP")) S X=$O(^HLMA("AH",HL("RAP"),HL("MID"),0)) D  Q:'$D(HLMTIENS)
     33 I $G(HL("MID"))]"",$G(HL("RAP")) S X=$O(^HLMA("AH",HL("RAP"),HL("MID"),0)) D  Q:'$D(HLMTIENS)
     34 . ;HLASTMSG=last ien received during this connection
     35 . ;if no duplicate, save msg. ien and quit
     36 . I X=HLMTIENS!'X S HLASTMSG=HLMTIENS Q
     37 . N MSH,OIENS
     38 . S (OIENS,Y)=X D  S Y=HLMTIENS D
     39 .. ;combine MSH into single string
     40 .. S MSH(Y)="",I=0 F  S I=$O(^HLMA(Y,"MSH",I)) Q:'I  S MSH(Y)=MSH(Y)_$G(^(I,0))
     41 .; patch 117 & 125, check if identical
     42 .I MSH(HLMTIENS)'=MSH(OIENS) S HLASTMSG=HLMTIENS Q
     43 .;
     44 . ;msg is duplicate, set status as duplicate
     45 . D STATUS^HLTF0(HLMTIENS,4,109,"Duplicate with ien "_OIENS,1),EXIT
     46 . ;msg was resent during this connection, ignore it.
     47 . I HLASTMSG=HLMTIENS K HLMTIENS Q
     48 . ;find original response and send back
     49 . S HLASTRSP=$O(^HLMA("AF",OIENS,OIENS))
     50 ;
     51 ;Quit if this is acknowledgment to acknowledgement message
     52 I $G(HL("ACK")) D  Q
     53 . ;Update status of original acknowledgment message to successfully
     54 . D STATUS^HLTF0(HL("MTIENS"),3,,,1),STATUS^HLTF0(HLMTIENS,3,,,1)
     55 . ;unlock record
     56 . D EXIT
     57 ;
     58 ;enhance ack., send commit, quit if not an ack, msg will be processed by filer
     59 I $G(HL("ACAT"))="AL" D  Q:'$G(HL("MTIENS"))
     60 . ;msg is a resend, HLASTRSP=ien of original response
     61 .I $G(HLASTRSP) D
     62 ..S HLTCP=HLASTRSP
     63 ..D LLCNT^HLCSTCP(HLDP,3)
     64 . E  D  Q:'$G(HLTCP)
     65 ..D ACK^HLTP4("CA") ;**109** LLCNT^HLCSTCP(HLDP,3) called in ACK^HLTP4
     66 . S X=$$WRITE^HLCSTCP2(HLTCP)
     67 . D LLCNT^HLCSTCP(HLDP,4),STATUS^HLTF0(HLTCP,3,,,1):'$G(HLASTRSP)
     68 . S HLTCP=""
     69 . ;if not an ack, set status to awaiting processing **109** and put on in queue
     70 . I '$G(HL("MTIENS")),'$G(HLASTRSP) D STATUS^HLTF0(HLMTIENS,9),EXIT,SETINQUE^HLTP31
     71 ;
     72 ;enhance ack., no commit & no app ack
     73 I $G(HL("ACAT"))="NE",$G(HL("APAT"))="NE" D  Q
     74 . ;set status to awaiting processing, **109** and put on in queue
     75 . I '$G(HLASTRSP) D STATUS^HLTF0(HLMTIENS,9),EXIT,SETINQUE^HLTP31
     76 ;
     77 ; patch HL*1.6*120 start
     78 ;resending old response, msg is a resend
     79 ; I $G(HLASTRSP) S HLTCP=HLASTRSP G ACK
     80 ; do not re-send duplicate message when $G(HL("ACAT"))="AL"
     81 I $G(HLASTRSP),$G(HL("ACAT"))'="AL" S HLTCP=HLASTRSP G ACK
     82 ; quit if duplicate
     83 Q:$G(HLASTRSP)
     84 ; patch HL*1.6*120 end
     85 ;
     86CONT ;continue processing an enhance ack msg. called from DEFACK
     87 ;Set special HL variables for processing rtn
     88 S HLQUIT=0,HLNODE="",HLNEXT="D HLNEXT^HLCSUTL"
     89 ;
     90 ; message is an acknowledgement, HLMSA=ack code^id^text
     91 I ($G(HLMSA)]"") D  Q
     92 . ;X=1 if ack ok, 0=reject of error
     93 . S X=$E(HLMSA,2)="A"
     94 . ;Update status of original subscriber message and remove it from the out-going queue
     95 . D STATUS^HLTF0(HL("MTIENS"),$S(X:3,1:4),"",$S(X:"",1:$P(HLMSA,HL("FS"),3)),1)
     96 . D DEQUE^HLCSREP($P($G(^HLMA(HL("MTIENS"),0)),"^",7),"O",HL("MTIENS"))
     97 . D
     98 .. N HLTCP ;New variable to update status in file #772.
     99 ..;
     100 ..;**108**
     101 .. N TEMP
     102 .. S TEMP=HLMTIENS
     103 .. N HLMTIENS
     104 .. S HLMTIENS=TEMP
     105 ..;**END 108**
     106 ..;
     107 .. D PROCACK^HLTP2(HLMTIEN,HL("EID"),.HLRESLT,.HL)
     108 . ;update status of incoming to complete & unlock
     109 . 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
     110 ;
     111 ;get entry action, exit action and processing routine
     112 K HLHDR,HLLD0,HLLD1,HLMSA
     113 I HL("EIDS")="",$G(HLEIDS)]"" S HL("EIDS")=HLEIDS ;**CIRN**
     114 D EVENT^HLUTIL1(HL("EIDS"),"15,20,771",.HLN)
     115 S HLENROU=$G(HLN(20)),HLEXROU=$G(HLN(15)),HLPROU=$G(HLN(771))
     116 ;quit if no processing routine,update status and quit
     117 I HLPROU']"" S HLRESLT="10^"_$G(^HL(771.7,10,0)) D STATUS^HLTF0(HLMTIENS,3,,,1),EXIT Q
     118 ;HLORNOD=subscriber protocol for Fileman auditing, ien;global ref
     119 N HLORNODD S HLORNOD=HL("EIDS")_";ORD(101,"
     120 ;Execute entry action of client protocol
     121 X:HLENROU]"" HLENROU K HLENROU,HLDONE1
     122 ;
     123 ;Execute processing routine
     124 X HLPROU S HLRESLT=0 S:($D(HLERR)) HLRESLT="9^"_HLERR
     125 ;update status of incoming to complete & unlock
     126 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
     127 ;HLTCPO=link open, HLTCP=ien of acknowledgment msg. from GENACK
     128ACK I $G(HLTCPO),$G(HLTCP) D  Q
     129 . D LLCNT^HLCSTCP(HLDP,3)
     130 . ;write ack back over open tcp link
     131 . S X=$$WRITE^HLCSTCP2(HLTCP)
     132 . ;update status of ack to complete
     133 . D:'$G(HLASTRSP) STATUS^HLTF0(HLTCP,3,,,1)
     134 . D LLCNT^HLCSTCP(HLDP,4)
     135 Q
     136 ;
     137DEFACK(HLDP,X) ;process the deferred application ack, called from HLCSIN
     138 ;HLDP=logical link, X=ien in file 773
     139 ;
     140 ; patch HL*1.6*120 start
     141 ; clean variables except Kernel related variables
     142 D
     143 . ; protect variables defined in STARTIN^HLCSIN
     144 . N HLFLG,HLEXIT,HLPTRFLR
     145 . ; protect variables defined in DEFACK^HLCSIN
     146 . N HLXX,HLD0,HLPCT
     147 . ; protect input parameters of this sub-routine
     148 . N HLDP,X
     149 . D KILL^XUSCLEAN
     150 ; patch HL*1.6*120 end
     151 ;
     152 ;set error trap
     153 N $ETRAP,$ESTACK S $ETRAP="D ERROR^HLTP3"
     154 N HLERR     ;patch HL*1.6*109
     155 Q:'$G(HLDP)!'$G(X)  Q:'$G(^HLMA(X,0))
     156 ;**109 START**
     157 Q:'$D(^HLMA("AC","I",HLDP,X))
     158 ;**109 END**
     159 ;
     160 N HL,HLA,HLD0,HLEID,HLEIDS,HLHDR,HLHDRO,HLMTIEN,HLMTIENS,HLJ,HLMSA,HLN,HLQUIT,HLNODE,HLNEXT,HLRESLT,HLRESLTA,HLTCP,HLXX,Z,HLDONE1
     161 ;setup variables
     162 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")=""""""
     163 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)
     164 S:$P(X,U,15) HL("MTP_ETP")=$P(X,U,15)
     165 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)
     166 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)
     167 S:$G(HL("MTP_ETP")) HL("MTN_ETN")=$P($G(^HL(779.005,HL("MTP_ETP"),0)),U)
     168 S HL("EID")=$P($G(^HL(772,HLMTIEN,0)),U,10)
     169 M HLHDRO=^HLMA(HLMTIENS,"MSH")
     170 ; if no header quit
     171 ;**109**
     172 ;I '$O(HLHDRO(0)) L -^HLMA(HLMTIENS) Q
     173 Q:'$O(HLHDRO(0))
     174 ;
     175 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)
     176 ;
     177 ; patch HL*1.6*109 start
     178 ; quit if ien of #772 is not defined
     179 Q:'HLMTIEN
     180 ; quit if field separator is not defined
     181 Q:HL("FS")=""
     182 ; patch HL*1.6*109 end
     183 ;
     184 S X=$$P^HLTPCK2(.HLHDRO,1)
     185 ;
     186 ; patch HL*1.6*120 start
     187 I X="MSH" D
     188 . 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)
     189 . ;
     190 . ; 2nd component is Processing mode
     191 . S HL("PMOD")=$P(HL("PID"),$E(HL("ECH"),1),2)
     192 . ; first component is Processing id
     193 . S HL("PID")=$P(HL("PID"),$E(HL("ECH"),1))
     194 ;
     195 I X'="MSH" D
     196 . S X=$$P^HLTPCK2(.HLHDRO,9),Z=$E(HL("ECH")),HL("PID")=$P(X,Z,2),HL("VER")=$P(X,Z,4)
     197 . ;
     198 . ; original implementation incorrectly treats repetition separator as
     199 . ; subcomponent separator
     200 . I $E(HL("ECH"),2)]"",X[$E(HL("ECH"),2) D
     201 .. S HL("SUB-COMPONENT")=$E(HL("ECH"),2)
     202 . ; if subcomponent separator is correctly applied
     203 . I $E(HL("ECH"),4)]"",X[$E(HL("ECH"),4) D
     204 .. S HL("SUB-COMPONENT")=$E(HL("ECH"),4)
     205 . ;
     206 . I $D(HL("SUB-COMPONENT")),HL("PID")[HL("SUB-COMPONENT") D
     207 .. ; 2nd sub-component is Processing mode
     208 .. S HL("PMOD")=$P(HL("PID"),HL("SUB-COMPONENT"),2)
     209 .. ; first sub-component is Processing id
     210 .. S HL("PID")=$P(HL("PID"),HL("SUB-COMPONENT"))
     211 . ; patch HL*1.6*120 end
     212 . ;
     213 . Q:$$P^HLTPCK2(.HLHDRO,10)=""
     214 . ;HLMSA=ack code^id^text
     215 . 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)
     216 ;
     217 ; HL*1.6*108
     218 ; quit if this is a commit ack
     219 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
     220 ; **
     221 ;
     222 ;**  HL*1.6*117 **
     223 K HLL("SET FOR APP ACK"),HLL("LINKS")
     224 ;** END HL*1.6*117 **
     225 ;
     226 D CONT
     227 Q
     228 ;
     229MSA(Y) ;Y=ien in 772, returns MSA segment
     230 ;ack code^msg being ack id^text
     231 N X
     232 S X=$G(^HL(772,Y,"IN",1,0)),X=$S($E(X,1,3)="MSA":$E(X,5,999),1:"")
     233 Q X
     234 ;
     235ERROR ;error trap
     236 D ^%ZTER
     237 I $G(HLMTIENS),$D(^HLMA(HLMTIENS,0)) D STATUS^HLTF0(HLMTIENS,4,,,1),EXIT
     238 ;*109* release all locks created by inbound filer
     239 L -^HLMA("AC","I",+$G(HLXX))
     240 G UNWIND^%ZTER
     241 ;
     242 ;
     243EXIT ;unlock
     244 I $G(HLMTIENS) L -^HLMA(HLMTIENS)
     245 Q
     246 ;
     247ONAC(IEN773) ;
     248 ;Returns 1 if the message is on the "AC","I" xref
     249 ;Returns 0 otherwise
     250 ;
     251 N LINK
     252 S LINK=$P($G(^HLMA(IEN773,0)),"^",17)
     253 Q:'LINK 0
     254 Q $D(^HLMA("AC","I",LINK,IEN773))
Note: See TracChangeset for help on using the changeset viewer.