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/HLCSTCP4.m

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