| 1 | XWBPRS ;ISF/STAFF - VISTA BROKER MSG PARSER ; 3/28/2006 | 
|---|
| 2 | ;;1.1;RPC BROKER;**35,43,46**;Mar 28, 1997 | 
|---|
| 3 | ;XWB holds info from the message used by the RPC | 
|---|
| 4 | CALLP(XWBP,XWBDEBUG) ;make API call using Protocol string | 
|---|
| 5 | N ERR,S,XWBARY K XWB | 
|---|
| 6 | S ERR=0 | 
|---|
| 7 | S ERR=$$PRSP("[XWB]") ;Read the rest of the protocol header | 
|---|
| 8 | I '+ERR S ERR=$$PRSM ;Read and parse message | 
|---|
| 9 | I $G(XWB(2,"RPC"))="XUS SET SHARED" S XWBSHARE=1 Q | 
|---|
| 10 | I '+ERR S ERR=$$RPC ;Check the RPC | 
|---|
| 11 | I +ERR S XWBSEC=$P(ERR,U,2) ;P10 -- dpc | 
|---|
| 12 | I '+ERR D CHKPRMIT^XWBSEC($G(XWB(2,"RPC"))) ;checks if RPC allowed to run | 
|---|
| 13 | S:$L($G(XWBSEC)) ERR="-1^"_XWBSEC | 
|---|
| 14 | I '+ERR D | 
|---|
| 15 | . D CAPI(.XWBP,XWB("PARAM")) | 
|---|
| 16 | E  I ($G(XWBTCMD)'="#BYE#") D LOG^XWBTCPM("Bad Msg"_ERR),CLRBUF | 
|---|
| 17 | I 'XWBDEBUG K XWB | 
|---|
| 18 | I $D(XWBARY) K @XWBARY,XWBARY | 
|---|
| 19 | Q | 
|---|
| 20 | ; | 
|---|
| 21 | PRSP(P) ;ef, Parse Protocol | 
|---|
| 22 | ;M Extrinsic Function | 
|---|
| 23 | ;Outputs | 
|---|
| 24 | ;ERR      0 for success, "-1^Text" if error | 
|---|
| 25 | ; | 
|---|
| 26 | N ERR,C,M,R,X | 
|---|
| 27 | S R=0,C=";",ERR=0 | 
|---|
| 28 | S P=$$BREAD^XWBRW(4) | 
|---|
| 29 | IF $L(P)'=4 S ERR="-1^Short Header info" | 
|---|
| 30 | IF +ERR=0 D | 
|---|
| 31 | . S XWB(R,"VER")=+$E(P,1) | 
|---|
| 32 | . S XWB(R,"TYPE")=+$E(P,2) | 
|---|
| 33 | . S (XWBENVL,XWB(R,"LENV"))=+$E(P,3) | 
|---|
| 34 | . S (XWBPRT,XWB(R,"RT"))=+$E(P,4) | 
|---|
| 35 | I XWBENVL<1 S (XWBENVL,XWB(R,"LENV"))=3 | 
|---|
| 36 | Q ERR | 
|---|
| 37 | ; | 
|---|
| 38 | PRSM() ;ef, Parse message | 
|---|
| 39 | ;M Extrinsic Function | 
|---|
| 40 | ;See document on msg format | 
|---|
| 41 | ;Outputs | 
|---|
| 42 | ;ERR      0 for success, "-1^Text" if error | 
|---|
| 43 | N C,EX1,ERR,R,X,CNK | 
|---|
| 44 | S R=1,C=";",CNK=0,EX1=0 ;Max buffer | 
|---|
| 45 | S ERR="-1^Invalid Chunk" | 
|---|
| 46 | F  S CNK=$$BREAD^XWBRW(1) Q:("12345"'[CNK)  D  Q:EX1 | 
|---|
| 47 | . S EX1=(CNK=5),@("ERR=$$PRS"_CNK) | 
|---|
| 48 | Q ERR | 
|---|
| 49 | ; | 
|---|
| 50 | PRS1() ;Parse the HEADER chunk | 
|---|
| 51 | N %,L,R | 
|---|
| 52 | S R=1 | 
|---|
| 53 | S XWB(R,"VER")=$$SREAD | 
|---|
| 54 | S XWB(R,"RETURN")=$$SREAD | 
|---|
| 55 | Q 0 | 
|---|
| 56 | ; | 
|---|
| 57 | PRS2() ;Parse the RPC chunk | 
|---|
| 58 | N L,R | 
|---|
| 59 | S R=2 | 
|---|
| 60 | S (XWBAPVER,XWB(R,"VER"))=$$SREAD ;RPC version | 
|---|
| 61 | S XWB(R,"RPC")=$$SREAD | 
|---|
| 62 | I $G(XWBDEBUG)>1 D LOG^XWBTCPM("RPC: "_XWB(R,"RPC")) | 
|---|
| 63 | Q 0 | 
|---|
| 64 | PRS3() ;Parse the Security chunk | 
|---|
| 65 | N L,R | 
|---|
| 66 | S R=3 | 
|---|
| 67 | Q 0 | 
|---|
| 68 | PRS4() ;Parse the Command chunk | 
|---|
| 69 | N R | 
|---|
| 70 | S R=4,XWBTCMD=$$SREAD,XWB(R,"CMD")=XWBTCMD | 
|---|
| 71 | I $G(XWBDEBUG)>1 D LOG^XWBTCPM("CMD: "_XWBTCMD) | 
|---|
| 72 | Q ("TCPConnect^#BYE#"[XWBTCMD) | 
|---|
| 73 | ; | 
|---|
| 74 | PRS5() ;Parse Data Parameter chunk | 
|---|
| 75 | ;M Extrinsic Function | 
|---|
| 76 | ;Outputs | 
|---|
| 77 | ;ERR      0 for success, "-1^Text" if error | 
|---|
| 78 | ; | 
|---|
| 79 | N CONT,DONE,ERR,F,FL,IX,K,L,P1,P2,P3,P4,P5,MAXP,R,TY,VA | 
|---|
| 80 | S R=5,ERR=0,F=3,IX=0,DONE=0,CONT="f",XWB("PARAM")="" | 
|---|
| 81 | F  S:CONT="f" TY=$$BREAD^XWBRW(1) D  Q:DONE  S CONT=$$BREAD^XWBRW(1) S:CONT'="t" IX=IX+1 | 
|---|
| 82 | . K VA,P1 | 
|---|
| 83 | . IF TY=$C(4) S DONE=1 Q  ;EOT | 
|---|
| 84 | . IF TY=0 D  Q  ;literal | 
|---|
| 85 | . . D LREAD("VA") | 
|---|
| 86 | . . S XWB(R,"P",IX)=VA(1) D PARAM($NA(XWB(R,"P",IX))) | 
|---|
| 87 | . . Q | 
|---|
| 88 | . IF TY=1 D  Q  ;reference | 
|---|
| 89 | . . D LREAD("VA") | 
|---|
| 90 | . . S XWB(R,"P",IX)=$$GETV(VA(1)) D PARAM($NA(XWB(R,"P",IX))) | 
|---|
| 91 | . . Q | 
|---|
| 92 | . IF TY=2 D  Q  ;list | 
|---|
| 93 | . . I CONT'="t" D | 
|---|
| 94 | . . . S XWBARY=$$OARY,XWB(R,"P",IX)="."_XWBARY | 
|---|
| 95 | . . . D PARAM(XWB(R,"P",IX)) | 
|---|
| 96 | . . D LREAD("P1") Q:P1(1)=""  D LREAD("VA") | 
|---|
| 97 | . . D LINST(XWBARY,P1(1),VA(1)) | 
|---|
| 98 | . . Q | 
|---|
| 99 | . IF TY=3 D  Q  ;global | 
|---|
| 100 | . . I CONT'="t" D | 
|---|
| 101 | . . . S XWBARY=$NA(^TMP("XWBA",$J,IX)),XWB(R,"P",IX)=XWBARY | 
|---|
| 102 | . . . K @XWBARY S @XWBARY="" | 
|---|
| 103 | . . . D PARAM(XWBARY) | 
|---|
| 104 | . . D LREAD("P1") Q:P1(1)=""  D LREAD("VA") | 
|---|
| 105 | . . D GINST(XWBARY,P1(1),VA(1)) | 
|---|
| 106 | . . Q | 
|---|
| 107 | . IF TY=4 D  Q  ;empty - ,, | 
|---|
| 108 | . . S XWB(R,"XWB",IX)="" | 
|---|
| 109 | . . Q | 
|---|
| 110 | . IF TY=5 D  Q | 
|---|
| 111 | . . ;stream still to be done | 
|---|
| 112 | . Q  ;End of loop | 
|---|
| 113 | Q ERR | 
|---|
| 114 | PARAM(NA) ;Add a new parameter to the list | 
|---|
| 115 | N A | 
|---|
| 116 | S A=$G(XWB("PARAM")) S:'$L(NA) NA="""""" ;Empty | 
|---|
| 117 | S A=A_$S($L(A):",",1:"")_$S(TY=3:"$NA(",1:"")_NA_$S(TY=3:")",1:"") | 
|---|
| 118 | S XWB("PARAM")=A | 
|---|
| 119 | Q | 
|---|
| 120 | ; | 
|---|
| 121 | RPC() ;Check the rpc information. | 
|---|
| 122 | ;M Extrinsic Function | 
|---|
| 123 | ;Outputs | 
|---|
| 124 | ;ERR      0 for success, "-1^Text" if error | 
|---|
| 125 | ; | 
|---|
| 126 | N C,DR,ERR,M,R,RPC,T,X | 
|---|
| 127 | S R=2,C=";",ERR=0,M=512 ;Max buffer | 
|---|
| 128 | S RPC=$G(XWB(R,"RPC")) I '$L(RPC) Q "-1^No RPC sent" | 
|---|
| 129 | S T=$O(^XWB(8994,"B",RPC,0)) | 
|---|
| 130 | I '+T Q "-1^Remote Procedure '"_RPC_"' doesn't exist on the server." | 
|---|
| 131 | S T(0)=$G(^XWB(8994,T,0)) | 
|---|
| 132 | I $P(T(0),U,6)=1!($P(T(0),U,6)=2) Q "-1^Remote Procedure '"_RPC_"' cannot be run at this time."  ;P10. Check INACTIVE field. - dpc. | 
|---|
| 133 | S XWB(R,"RTAG")=$P(T(0),"^",2) | 
|---|
| 134 | S XWB(R,"RNAM")=$P(T(0),"^",3) | 
|---|
| 135 | S XWBPTYPE=$P(T(0),"^",4) | 
|---|
| 136 | S XWBWRAP=+$P(T(0),"^",8) | 
|---|
| 137 | Q ERR | 
|---|
| 138 | ; | 
|---|
| 139 | SREAD() ;Read a S_PACK | 
|---|
| 140 | N L,V7 | 
|---|
| 141 | S L=$$BREAD^XWBRW(1),L=$A(L) | 
|---|
| 142 | S V7=$$BREAD^XWBRW(L) | 
|---|
| 143 | Q V7 | 
|---|
| 144 | ; | 
|---|
| 145 | LREAD(ROOT) ;Read a L_PACK | 
|---|
| 146 | N L,V7,I ;p45 Remove limit on length of string. | 
|---|
| 147 | S I=1,@ROOT@(I)="" | 
|---|
| 148 | S L=$$BREAD^XWBRW(XWBENVL),L=+L | 
|---|
| 149 | I L>0 S V7=$$BREAD^XWBRW(L),@ROOT@(I)=V7,I=I+1 | 
|---|
| 150 | Q | 
|---|
| 151 | ; | 
|---|
| 152 | ;X can be something like '"TEXT",1,0'. | 
|---|
| 153 | LINST(A,X,XWBY) ;instantiate local array | 
|---|
| 154 | IF XWBY=$C(1) S XWBY="" | 
|---|
| 155 | S X=A_"("_X_")" | 
|---|
| 156 | S @X=XWBY | 
|---|
| 157 | Q | 
|---|
| 158 | ; | 
|---|
| 159 | ;S can be something like '"TEXT",1,0'. | 
|---|
| 160 | GINST(R,S,V) ;instantiate global | 
|---|
| 161 | N N | 
|---|
| 162 | I V=$C(1) S V="" | 
|---|
| 163 | S N=$P(R,")")_","_S_")" | 
|---|
| 164 | S @N=V | 
|---|
| 165 | Q | 
|---|
| 166 | ; | 
|---|
| 167 | GETV(V) ;get value of V - reference parameter | 
|---|
| 168 | N X | 
|---|
| 169 | S X=V | 
|---|
| 170 | IF $E(X,1,2)="$$" Q "" | 
|---|
| 171 | IF $C(34,36)[$E(V) X "S V="_$$VCHK(V) | 
|---|
| 172 | E  S V=@V | 
|---|
| 173 | Q V | 
|---|
| 174 | ; | 
|---|
| 175 | VCHK(S) ;Parse string for first argument | 
|---|
| 176 | N C,I,P | 
|---|
| 177 | F I=1:1 S C=$E(S,I) D VCHKP:C="(",VCHKQ:C=$C(34) Q:" ,"[C | 
|---|
| 178 | Q $E(S,1,I-1) | 
|---|
| 179 | VCHKP S P=1 ;Find closing paren | 
|---|
| 180 | F I=I+1:1 S C=$E(S,I) Q:P=0!(C="")  I "()"""[C D VCHKQ:C=$C(34) S P=P+$S("("[C:1,")"[C:-1,1:0) | 
|---|
| 181 | Q | 
|---|
| 182 | VCHKQ ;Find closing quote | 
|---|
| 183 | F I=I+1:1 S C=$E(S,I) Q:C=""!(C=$C(34)) | 
|---|
| 184 | Q | 
|---|
| 185 | CLRBUF ;Empties Input buffer | 
|---|
| 186 | N % | 
|---|
| 187 | F  R *%:2 Q:'$T!(%=4)  ;!(%=-1) | 
|---|
| 188 | Q | 
|---|
| 189 | ZZZ(X) ;Convert | 
|---|
| 190 | N I | 
|---|
| 191 | F  S I=$F(X,"$C(") Q:'I  S J=$F(X,")",I),X=$E(X,1,I-4)_$C($E(X,I,J-2))_$E(X,J,999) | 
|---|
| 192 | Q X | 
|---|
| 193 | ; | 
|---|
| 194 | CAPI(XWBY,PAR) ;make API call | 
|---|
| 195 | N XWBCALL,T,DX,DY | 
|---|
| 196 | S XWBCALL=XWB(2,"RTAG")_"^"_XWB(2,"RNAM")_"(.XWBY"_$S($L(PAR):","_PAR,1:"")_")",XWBCALL2="" | 
|---|
| 197 | K PAR | 
|---|
| 198 | O XWBNULL U XWBNULL ;p43 Make sure its open | 
|---|
| 199 | ; | 
|---|
| 200 | I $G(XWBDEBUG)>2 D LOG^XWBDLOG("Call: "_$E(XWBCALL,1,247)) | 
|---|
| 201 | ;start RUM for RPC | 
|---|
| 202 | I $G(XWB(2,"CAPI"))]"" D LOGRSRC^%ZOSV(XWB(2,"CAPI"),2,1) | 
|---|
| 203 | ; | 
|---|
| 204 | D @XWBCALL S XWBCALL2=XWBCALL ;Save call for debug | 
|---|
| 205 | ; | 
|---|
| 206 | ;restart RUM for handler | 
|---|
| 207 | D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,1) | 
|---|
| 208 | ; | 
|---|
| 209 | U XWBTDEV | 
|---|
| 210 | Q | 
|---|
| 211 | ; | 
|---|
| 212 | OARY() ;create storage array | 
|---|
| 213 | N A,DONE,I | 
|---|
| 214 | S I=1+$G(XWB("ARRAY")),XWB("ARRAY")=I | 
|---|
| 215 | S A="XWBS"_I | 
|---|
| 216 | K @A ;temp fix for single array | 
|---|
| 217 | S @A="" ;set naked | 
|---|
| 218 | Q A | 
|---|
| 219 | ; | 
|---|
| 220 | CREF(R,P) ;Convert array contained in P to reference A | 
|---|
| 221 | N I,X,DONE,F1,S | 
|---|
| 222 | S DONE=0 | 
|---|
| 223 | S S="" | 
|---|
| 224 | F I=1:1  D  Q:DONE | 
|---|
| 225 | . IF $P(P,",",I)="" S DONE=1 Q | 
|---|
| 226 | . S X(I)=$P(P,",",I) | 
|---|
| 227 | . IF X(I)?1"."1A.E D | 
|---|
| 228 | . . S F1=$F(X(I),".") | 
|---|
| 229 | . . S X(I)="."_R | 
|---|
| 230 | . S S=S_X(I)_"," | 
|---|
| 231 | Q $E(S,1,$L(S)-1) | 
|---|
| 232 | ; | 
|---|