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 | ;
|
---|