| 1 | XWBDRPC ;ISF/RWF - Deferred RPCs, used by XWB2HL7 ;01/14/2003  09:27
 | 
|---|
| 2 |  ;;1.1;RPC BROKER;**12,20,32**;Mar 28, 1997
 | 
|---|
| 3 |  Q
 | 
|---|
| 4 |  ;This is the entry point used by the Broker
 | 
|---|
| 5 | EN1(RET,RPC,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10) ;Call a deferred RPC with 1-7 parameters.
 | 
|---|
| 6 |  N X,I,INX,N,XWBPAR,XWBPCNT,XWBDVER,XWBHDL
 | 
|---|
| 7 |  N XWBMSG,ZTSAVE,ZTDTH,ZTIO,ZTRTN,ZTSK,ZTDESC
 | 
|---|
| 8 |  S RET="",(XWBPAR,RPCIEN)="",XWBPCNT=0,XWBDVER=1
 | 
|---|
| 9 |  ;Find RPC.
 | 
|---|
| 10 |  S RPCIEN=$$RPCIEN^XWBLIB($P(RPC,"^")) I RPCIEN'>0 S RET(0)="",RET(1)="-1^RPC not found" Q
 | 
|---|
| 11 |  ;Check if RPC is active
 | 
|---|
| 12 |  I '$$RPCAVAIL^XWBLIB(RPCIEN,"L") S RET(0)="-1^RPC Access Blocked" Q
 | 
|---|
| 13 |  ;Build a handle to link request with return.
 | 
|---|
| 14 |  S XWBHDL=$$HANDLE()
 | 
|---|
| 15 |  F I=1:1:10 Q:'$D(@("P"_I))  S XWBPCNT=I
 | 
|---|
| 16 |  ;Build ZTSAVE
 | 
|---|
| 17 |  F N="RPC","XWBHDL","XWBPCNT","P1","P2","P3","P4","P5","P6","P7","P8","P9","P10" Q:'$D(@N)  S ZTSAVE(N)="" S:$D(@N)>9 ZTSAVE(N_"(")=""
 | 
|---|
| 18 |  S ZTDESC="Deferred RPC - "_RPC
 | 
|---|
| 19 |  S ZTRTN="DQ^XWBDRPC",ZTIO="NULL",ZTDTH=(+$H_",10") ;run first
 | 
|---|
| 20 |  ;Call Taskman
 | 
|---|
| 21 |  D ^%ZTLOAD
 | 
|---|
| 22 |  S RET(0)=XWBHDL
 | 
|---|
| 23 |  I ZTSK>0 D SETNODE(XWBHDL,"TASKID",ZTSK)
 | 
|---|
| 24 |  Q
 | 
|---|
| 25 |  ;
 | 
|---|
| 26 |  ;This is called by TaskMan to process a RPC.
 | 
|---|
| 27 | DQ ;
 | 
|---|
| 28 |  N $ES,$ET S $ET="D ERR^XWBDRPC"
 | 
|---|
| 29 |  N %,%1,%2,IX,X,Y,ERR,PAR
 | 
|---|
| 30 |  S IX=0,XWBAPVER=+$P(RPC,"^",2),RPC=$P(RPC,"^")
 | 
|---|
| 31 |  S XWBRPC=0,XWBRPC=$$RPCGET(RPC,.XWBRPC) I XWBRPC'>0 S XWBY(0)="-1^RPC name not found" G REX
 | 
|---|
| 32 |  S PAR=$$PARAM D SETNODE(XWBHDL,"WRAP",XWBRPC("WRAP"))
 | 
|---|
| 33 |  S X=$$HDLSTA(XWBHDL,"0^Running") ;Tell user we started
 | 
|---|
| 34 |  ;Result returned in XWBY
 | 
|---|
| 35 |  D CAPI(XWBRPC("RTAG"),XWBRPC("RNAM"),PAR)
 | 
|---|
| 36 | REX ;Exit from RPC
 | 
|---|
| 37 |  ;Check to see if our handle is still good.
 | 
|---|
| 38 |  I $$HDLSTA(XWBHDL,"0^LoadRestlts")<0 S XWBY(0)="-1^Abort" Q
 | 
|---|
| 39 |  ;Move data into XTMP for application to pick up.
 | 
|---|
| 40 |  I $D(XWBY)>9 D
 | 
|---|
| 41 |  . S %1="XWBY"
 | 
|---|
| 42 |  . F  S %1=$Q(@%1) Q:%1=""  D PLACE(XWBHDL,@%1)
 | 
|---|
| 43 |  I $D(XWBY)=1,$E(XWBY)'="^" D PLACE(XWBHDL,XWBY)
 | 
|---|
| 44 |  ;If XWBY is a $NA value just return it.
 | 
|---|
| 45 |  I $D(XWBY)=1,$E(XWBY)="^" D
 | 
|---|
| 46 |  . S %1=XWBY,%2=$E(XWBY,1,$L(XWBY)-1)
 | 
|---|
| 47 |  . F  S %1=$Q(@%1) Q:%1'[%2  D PLACE(XWBHDL,@%1)
 | 
|---|
| 48 |  S X=$$HDLSTA(XWBHDL,"1^Done")
 | 
|---|
| 49 |  Q
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 | CAPI(TAG,NAM,PAR) ;make API call
 | 
|---|
| 52 |  N R
 | 
|---|
| 53 |  S R=TAG_"^"_NAM_"(.XWBY"_$S(PAR="":")",1:","_PAR_")")
 | 
|---|
| 54 |  ;Ready to call RPC?
 | 
|---|
| 55 |  D @R
 | 
|---|
| 56 |  ;Return data in XWBY
 | 
|---|
| 57 |  Q
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 | ERR ;Handle an error
 | 
|---|
| 60 |  D ^%ZTER ;Record error
 | 
|---|
| 61 |  I $D(XWBHDL) S X=$$HDLSTA(XWBHDL,"-1^Error: "_$E($$EC^%ZOSV,1,200))
 | 
|---|
| 62 |  D UNWIND^%ZTER
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 | RTNDATA(RET,HDL) ;Return the data under a handle
 | 
|---|
| 65 |  N I,N,RD,WRAP S RET="" K ^TMP($J,"XWB")
 | 
|---|
| 66 |  I $G(HDL)="" S RET(0)="-1^Bad Handle" Q
 | 
|---|
| 67 |  S N=$$CHKHDL^XWBDRPC(HDL) I N<1 S RET(0)=N Q
 | 
|---|
| 68 |  I N'["Done" S RET(0)="-1^Not DONE" Q
 | 
|---|
| 69 |  ;Default is to return an array, switch to global if to big
 | 
|---|
| 70 |  S N=(^XTMP(HDL,"CNT")>100)
 | 
|---|
| 71 |  S I=0,RD=$S(N:$NA(^TMP($J,"XWB")),1:"RET")
 | 
|---|
| 72 |  ;Move into a TMP global, Global is killed in XWBTCPC
 | 
|---|
| 73 |  I N S RET=$NA(^TMP($J,"XWB")),I=$$RTRNFMT^XWBLIB(4) ;Make return a global
 | 
|---|
| 74 |  I N M ^TMP($J,"XWB")=^XTMP(HDL,"D")
 | 
|---|
| 75 |  I 'N F  S RET(I)=$G(^XTMP(HDL,"D",I)),I=$O(^XTMP(HDL,"D",I)) Q:I'>0
 | 
|---|
| 76 |  Q
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 | CLEAR(RET,HDL) ;Clear the data under a handle
 | 
|---|
| 79 |  K ^XTMP(HDL),^TMP("XWBHDL",$J,HDL)
 | 
|---|
| 80 |  S RET(0)=1
 | 
|---|
| 81 |  Q
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 | CLEARALL(RET) ;Clear ALL the data for this job.
 | 
|---|
| 84 |  N X
 | 
|---|
| 85 |  S X="" F  S X=$O(^TMP("XWBHDL",$J,X)) Q:X=""  D CLEAR(.RET,X)
 | 
|---|
| 86 |  Q
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 | RPCGET(N,R) ;Convert RPC name to IEN and parameters.
 | 
|---|
| 89 |  N T,T0
 | 
|---|
| 90 |  S T=$G(N) Q:T="" "-1^No RPC name"
 | 
|---|
| 91 |  S T=$$RPCIEN^XWBLIB(T) Q:T'>0 "-1^Bad RPC name"
 | 
|---|
| 92 |  Q:'$D(R) T
 | 
|---|
| 93 |  S T0=$G(^XWB(8994,T,0)),R("IEN")=T,R("NAME")=$P(T0,"^")
 | 
|---|
| 94 |  S R("RTAG")=$P(T0,"^",2),R("RNAM")=$P(T0,"^",3)
 | 
|---|
| 95 |  S R("RTNTYPE")=$P(T0,"^",4),R("WRAP")=$P(T0,"^",8)
 | 
|---|
| 96 |  Q T
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 | PARAM() ;Build remote parameter list
 | 
|---|
| 99 |  N I,%,X,A S X=""
 | 
|---|
| 100 |  F I=1:1:XWBPCNT S %="P"_I,A="XWBA"_I Q:'$D(@%)  K @A D
 | 
|---|
| 101 |  . I $D(@%)=1 S X=X_%_"," Q
 | 
|---|
| 102 |  . S X=X_"."_A_"," M @A=@% Q
 | 
|---|
| 103 |  Q $E(X,1,$L(X)-1)
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 | ADDHDL(HL) ;Add a handle to local set
 | 
|---|
| 106 |  S ^TMP("XWBHDL",$J,HL)=""
 | 
|---|
| 107 |  Q
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 | HANDLE() ;Return a unique handle into ^XTMP
 | 
|---|
| 110 |  N %H,A,J,HL
 | 
|---|
| 111 |  S %H=$H,J="XWBDRPC"_($J#2048)_"-"_(%H#7*86400+$P(%H,",",2))_"_",A=-1
 | 
|---|
| 112 | HAN2 S A=A+1,HL=J_A L +^XTMP(HL):0 I '$T G HAN2
 | 
|---|
| 113 |  I $D(^XTMP(HL)) L -^XTMP(HL) G HAN2
 | 
|---|
| 114 |  S ^XTMP(HL,0)=$$HTFM^XLFDT(%H+2)_"^"_$G(DT) L -^XTMP(HL)
 | 
|---|
| 115 |  S ^XTMP(HL,"STATUS")="0^New",^("CNT")=0
 | 
|---|
| 116 |  Q HL
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 | HDLSTA(HL,STATUS) ;update the status node in XTMP
 | 
|---|
| 119 |  Q:'$D(^XTMP(HL)) -1
 | 
|---|
| 120 |  L +^XTMP(HL):5
 | 
|---|
| 121 |  S ^XTMP(HL,"STATUS")=STATUS
 | 
|---|
| 122 |  L -^XTMP(HL)
 | 
|---|
| 123 |  Q 1
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 | PLACE(HL,DATA) ;Called to place each line of data.
 | 
|---|
| 126 |  N IX
 | 
|---|
| 127 |  Q:'$D(^XTMP(HL,"CNT"))
 | 
|---|
| 128 |  S IX=+$G(^XTMP(HL,"CNT")),^XTMP(HL,"D",IX)=DATA,^XTMP(HL,"CNT")=IX+1
 | 
|---|
| 129 |  Q
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 | RPCCHK(RET,HDL) ;RPC handle status check.
 | 
|---|
| 132 |  S RET(0)=$$CHKHDL(HDL)
 | 
|---|
| 133 |  Q
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 | CHKHDL(HL) ;Return the status of a handle
 | 
|---|
| 136 |  Q:'$D(^XTMP(HL)) "-1^Bad Handle"
 | 
|---|
| 137 |  L +^XTMP(HL):1 I '$T Q "0^Busy"
 | 
|---|
| 138 |  N % S %=$G(^XTMP(HL,"STATUS"),"0^Null")
 | 
|---|
| 139 |  L -^XTMP(HL)
 | 
|---|
| 140 |  Q %
 | 
|---|
| 141 |  ;
 | 
|---|
| 142 | GETNODE(HL,ND) ;Get a status node
 | 
|---|
| 143 |  Q $G(^XTMP(HL,ND))
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 | SETNODE(HL,ND,DATA) ;Set a status node
 | 
|---|
| 146 |  S ^XTMP(HL,ND)=DATA
 | 
|---|
| 147 |  Q
 | 
|---|
| 148 |  ;
 | 
|---|