Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: XWBPRS

XWBPRS.m

Go to the documentation of this file.
  1. XWBPRS ;ISF/STAFF - VISTA BROKER MSG PARSER ;08/11/15 09:49
  1. ;;1.1;RPC BROKER;**35,43,46,57,64,67**;Mar 28, 1997;Build 5
  1. ;Per VA Directive 6402, this routine should not be modified.
  1. ;
  1. ;XWB holds info from the message used by the RPC
  1. CALLP(XWBP,XWBDEBUG) ;make API call using Protocol string
  1. N ERR,S,XWBARY K XWB
  1. S ERR=0
  1. S ERR=$$PRSP("[XWB]") ;Read the rest of the protocol header
  1. I '+ERR S ERR=$$PRSM ;Read and parse message
  1. I $G(XWB(2,"RPC"))="XUS SET SHARED" S XWBSHARE=1 Q
  1. I '+ERR S ERR=$$RPC ;Check the RPC
  1. I +ERR S XWBSEC=$P(ERR,U,2) ;P10 -- dpc
  1. I '+ERR D CHKPRMIT^XWBSEC($G(XWB(2,"RPC"))) ;checks if RPC allowed to run
  1. S:$L($G(XWBSEC)) ERR="-1^"_XWBSEC
  1. I '+ERR D
  1. . D CAPI(.XWBP,XWB("PARAM"))
  1. E I ($G(XWBTCMD)'="#BYE#") D LOG^XWBTCPM("Bad Msg"_ERR),CLRBUF
  1. I 'XWBDEBUG K XWB
  1. I $D(XWBARY) K @XWBARY,XWBARY
  1. Q
  1. ;
  1. PRSP(P) ;ef, Parse Protocol
  1. ;M Extrinsic Function
  1. ;Outputs
  1. ;ERR 0 for success, "-1^Text" if error
  1. ;
  1. N ERR,C,M,R,X
  1. S R=0,C=";",ERR=0
  1. S P=$$BREAD^XWBRW(4)
  1. IF $L(P)'=4 S ERR="-1^Short Header info"
  1. IF +ERR=0 D
  1. . S XWB(R,"VER")=+$E(P,1)
  1. . S XWB(R,"TYPE")=+$E(P,2)
  1. . S (XWBENVL,XWB(R,"LENV"))=+$E(P,3)
  1. . S (XWBPRT,XWB(R,"RT"))=+$E(P,4)
  1. I XWBENVL<1 S (XWBENVL,XWB(R,"LENV"))=3
  1. Q ERR
  1. ;
  1. PRSM() ;ef, Parse message
  1. ;M Extrinsic Function
  1. ;See document on msg format
  1. ;Outputs
  1. ;ERR 0 for success, "-1^Text" if error
  1. N C,EX1,ERR,R,X,CNK
  1. S R=1,C=";",CNK=0,EX1=0 ;Max buffer
  1. S ERR="-1^Invalid Chunk"
  1. F S CNK=$$BREAD^XWBRW(1) Q:("12345"'[CNK) D Q:EX1
  1. . S EX1=(CNK=5),@("ERR=$$PRS"_CNK)
  1. Q ERR
  1. ;
  1. PRS1() ;Parse the HEADER chunk
  1. N %,L,R
  1. S R=1
  1. S XWB(R,"VER")=$$SREAD
  1. S XWB(R,"RETURN")=$$SREAD
  1. Q 0
  1. ;
  1. PRS2() ;Parse the RPC chunk
  1. N L,R
  1. S R=2
  1. S (XWBAPVER,XWB(R,"VER"))=$$SREAD ;RPC version
  1. S XWB(R,"RPC")=$$SREAD
  1. I $G(XWBDEBUG)>1 D LOG^XWBTCPM("RPC: "_XWB(R,"RPC"))
  1. Q 0
  1. PRS3() ;Parse the Security chunk
  1. N L,R
  1. S R=3
  1. Q 0
  1. PRS4() ;Parse the Command chunk
  1. N R
  1. S R=4,XWBTCMD=$$SREAD,XWB(R,"CMD")=XWBTCMD
  1. I $G(XWBDEBUG)>1 D LOG^XWBTCPM("CMD: "_XWBTCMD)
  1. Q ("TCPConnect^#BYE#"[XWBTCMD)
  1. ;
  1. PRS5() ;Parse Data Parameter chunk
  1. ;M Extrinsic Function
  1. ;Outputs
  1. ;ERR 0 for success, "-1^Text" if error
  1. ;
  1. N CONT,DONE,ERR,F,FL,IX,K,L,MAXP,P1,P2,P3,P4,P5,R,TY,VA
  1. S R=5,ERR=0,F=3,IX=0,DONE=0,CONT="f",XWB("PARAM")=""
  1. F S:CONT="f" TY=$$BREAD^XWBRW(1) D Q:DONE S CONT=$$BREAD^XWBRW(1) S:CONT'="t" IX=IX+1
  1. . K VA,P1
  1. . IF TY=$C(4) S DONE=1 Q ;EOT
  1. . IF TY=0 D Q ;literal
  1. . . D LREAD("VA")
  1. . . S XWB(R,"P",IX)=VA(1) D PARAM($NA(XWB(R,"P",IX)))
  1. . . Q
  1. . IF TY=1 D Q ;reference
  1. . . D LREAD("VA")
  1. . . S XWB(R,"P",IX)=$$GETV(VA(1)) D PARAM($NA(XWB(R,"P",IX)))
  1. . . Q
  1. . IF TY=2 D Q ;list
  1. . . I CONT'="t" D
  1. . . . S XWBARY=$$OARY,XWB(R,"P",IX)="."_XWBARY
  1. . . . D PARAM(XWB(R,"P",IX))
  1. . . D LREAD("P1") Q:P1(1)="" D LREAD("VA")
  1. . . D LINST(XWBARY,P1(1),VA(1))
  1. . . Q
  1. . IF TY=3 D Q ;global
  1. . . I CONT'="t" D
  1. . . . S XWBARY=$NA(^TMP("XWBA",$J,IX)),XWB(R,"P",IX)=XWBARY
  1. . . . K @XWBARY S @XWBARY=""
  1. . . . D PARAM(XWBARY)
  1. . . D LREAD("P1") Q:P1(1)="" D LREAD("VA")
  1. . . D GINST(XWBARY,P1(1),VA(1))
  1. . . Q
  1. . IF TY=4 D Q ;empty - ,,
  1. . . S XWB(R,"XWB",IX)=""
  1. . . Q
  1. . IF TY=5 D Q
  1. . . ;stream still to be done
  1. . Q ;End of loop
  1. Q ERR
  1. PARAM(NA) ;Add a new parameter to the list
  1. N A
  1. S A=$G(XWB("PARAM")) S:'$L(NA) NA="""""" ;Empty
  1. S A=A_$S($L(A):",",1:"")_$S(TY=3:"$NA(",1:"")_NA_$S(TY=3:")",1:"")
  1. S XWB("PARAM")=A
  1. Q
  1. ;
  1. RPC() ;Check the rpc information.
  1. ;M Extrinsic Function
  1. ;Outputs
  1. ;ERR 0 for success, "-1^Text" if error
  1. ;
  1. N C,DR,ERR,M,R,RPC,T,X
  1. S R=2,C=";",ERR=0,M=512 ;Max buffer
  1. S RPC=$G(XWB(R,"RPC")) I '$L(RPC) Q "-1^No RPC sent"
  1. S T=$O(^XWB(8994,"B",RPC,0))
  1. I '+T Q "-1^Remote Procedure '"_RPC_"' doesn't exist on the server."
  1. S T(0)=$G(^XWB(8994,T,0))
  1. I $P(T(0),U,6)=1!($P(T(0),U,6)=2) Q "-1^Remote Procedure '"_RPC_"' cannot be run at this time."
  1. S XWB(R,"RTAG")=$P(T(0),"^",2)
  1. S XWB(R,"RNAM")=$P(T(0),"^",3)
  1. S XWBPTYPE=$P(T(0),"^",4)
  1. S XWBWRAP=+$P(T(0),"^",8)
  1. Q ERR
  1. ;
  1. SREAD() ;Read a S_PACK
  1. N L,V7
  1. S L=$$BREAD^XWBRW(1),L=$A(L)
  1. S V7=$$BREAD^XWBRW(L)
  1. Q V7
  1. ;
  1. LREAD(ROOT) ;Read a L_PACK
  1. N L,V7,I ;p45 Remove limit on length of string.
  1. S I=1,@ROOT@(I)=""
  1. S L=$$BREAD^XWBRW(XWBENVL),L=+L
  1. I L>0 S V7=$$BREAD^XWBRW(L),@ROOT@(I)=V7,I=I+1
  1. Q
  1. ;
  1. ;X can be something like '"TEXT",1,0'.
  1. LINST(A,X,XWBY) ;instantiate local array
  1. IF XWBY=$C(1) S XWBY=""
  1. S X=A_"("_X_")"
  1. S @X=XWBY
  1. Q
  1. ;
  1. ;S can be something like '"TEXT",1,0'.
  1. GINST(R,S,V) ;instantiate global
  1. N N
  1. I V=$C(1) S V=""
  1. S N=$P(R,")")_","_S_")"
  1. S @N=V
  1. Q
  1. ;
  1. GETV(V) ;get value of V - reference parameter
  1. N X
  1. S X=V
  1. IF $E(X,1,2)="$$" Q ""
  1. IF $C(34,36)[$E(V) X "S V="_$$VCHK(V)
  1. E S V=@V
  1. Q V
  1. ;
  1. VCHK(S) ;Parse string for first argument
  1. N C,I,P
  1. F I=1:1 S C=$E(S,I) D VCHKP:C="(",VCHKQ:C=$C(34) Q:" ,"[C
  1. Q $E(S,1,I-1)
  1. VCHKP S P=1 ;Find closing paren
  1. 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)
  1. Q
  1. VCHKQ ;Find closing quote
  1. F I=I+1:1 S C=$E(S,I) Q:C=""!(C=$C(34))
  1. Q
  1. CLRBUF ;Empties Input buffer
  1. N %
  1. F R *%:2 Q:'$T!(%=4) ;!(%=-1)
  1. Q
  1. ZZZ(X) ;Convert
  1. N I,J
  1. 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)
  1. Q X
  1. ;
  1. CAPI(XWBY,PAR) ;make API call
  1. N XWBCALL,T,DX,DY
  1. ; ZEXCEPT: XWBFGTIM - created here, will be killed in STRTCVR2 or ONECOVER
  1. ; ZEXCEPT: XWBCSRPC - created here, will be killed in ONECOVER
  1. ; JLI 110606 next line checks for start call to Coversheet Timing
  1. I XWB(2,"RTAG")="START",XWB(2,"RNAM")="ORWCV" I +$G(^KMPTMP("KMPD-CPRS")) S XWBFGTIM=$H D STRTCVR1 I 1
  1. E I $G(XWBCOVER),$D(^TMP("XWBFGP",$J,"TODO",XWB(2,"RPC"))) S XWBFGTIM=$H,XWBCSRPC=XWB(2,"RPC")
  1. S XWBCALL=XWB(2,"RTAG")_"^"_XWB(2,"RNAM")_"(.XWBY"_$S($L(PAR):","_PAR,1:"")_")",XWBCALL2=""
  1. K PAR
  1. O XWBNULL U XWBNULL ;p43 Make sure its open
  1. ;
  1. I $G(XWBDEBUG)>2 D LOG^XWBDLOG("Call: "_$E(XWBCALL,1,247))
  1. ;start RUM for RPC
  1. ;P67-change "CAPI" to "RPC"
  1. I $G(XWB(2,"RPC"))]"" D LOGRSRC^%ZOSV(XWB(2,"RPC"),2,1)
  1. ;
  1. D @XWBCALL S XWBCALL2=XWBCALL ;Save call for debug
  1. ;
  1. I $G(XWBCOVER),XWB(2,"RTAG")="START",XWB(2,"RNAM")="ORWCV" D STRTCVR2(XWBY) I 1
  1. E I $D(XWBCOVER),$D(XWBCSRPC) D ONECOVER ; JLI 110606
  1. ;
  1. ;restart RUM for handler
  1. D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,1)
  1. ;
  1. U XWBTDEV
  1. Q
  1. ;
  1. OARY() ;create storage array
  1. N A,DONE,I
  1. S I=1+$G(XWB("ARRAY")),XWB("ARRAY")=I
  1. S A="XWBS"_I
  1. K @A ;temp fix for single array
  1. S @A="" ;set naked
  1. Q A
  1. ;
  1. CREF(R,P) ;Convert array contained in P to reference A
  1. N I,X,DONE,F1,S
  1. S DONE=0
  1. S S=""
  1. F I=1:1 D Q:DONE
  1. . IF $P(P,",",I)="" S DONE=1 Q
  1. . S X(I)=$P(P,",",I)
  1. . IF X(I)?1"."1A.E D
  1. . . S F1=$F(X(I),".")
  1. . . S X(I)="."_R
  1. . S S=S_X(I)_","
  1. Q $E(S,1,$L(S)-1)
  1. ;
  1. STRTCVR1 ; JLI 110606
  1. ; SET UP DATA FOR OBTAINING FOREGROUND PROCESSING TIMES FOR COVERSHEET LOADS
  1. ; REQUESTED FOR TIMING ON COMMODITY SERVERS, ETC.
  1. N DFN,IP,HWND,NODE
  1. ; ZEXCEPT: XWBCOVER - created here, will be killed when foreground processing is complete
  1. S XWBCOVER=1
  1. K ^TMP("XWBFGP",$J)
  1. S DFN=XWB(5,"P",0),IP=XWB(5,"P",1),HWND=XWB(5,"P",2)
  1. S NODE="ORWCV "_IP_"-"_HWND_"-"_DFN
  1. S ^TMP("XWBFGP",$J,"NODE")=NODE ; SO WE CAN GET IT EASILY EACH PASS
  1. S ^KMPTMP("KMPDT","ORWCV-FT",NODE)=XWBFGTIM_"^^"_$G(DUZ)_"^"_$G(IO("CLNM"))
  1. Q
  1. ;
  1. STRTCVR2(RETRNVAL) ; JLI 110606 - setup after coming back from initial start for coversheets
  1. N XWBFGDIF,I
  1. ; the return value contains ids for coversheets to be handled in the foreground separated by commas
  1. F I=1:1 S XWBCSID=$P(RETRNVAL,";",I) Q:XWBCSID="" D SETCSID(XWBCSID)
  1. K XWBFGTIM
  1. Q
  1. ;
  1. SETCSID(XWBCSID) ; Obtain and setup selected coversheet ids for foreground processing
  1. N I,RPC
  1. ; The coversheet ID value (XWBCSID) will be used for a look-up on the "AC" cross-reference of file 101.24.
  1. ; It is possible to have multiple entries with the same ID value, so checking that the 8th piece of the zero node of the value is a "C" will be required.
  1. F I=0:0 S I=$O(^ORD(101.24,"AC",XWBCSID,I)) Q:I'>0 I $P(^ORD(101.24,I,0),U,8)="C" S RPC=$P(^(0),U,13),RPC=$P(^XWB(8994,RPC,0),U),^TMP("XWBFGP",$J,"TODO",RPC)=I Q
  1. I $D(^TMP("XWBFGP",$J,"TODO","ORQQPX REMINDERS LIST")) D
  1. .N XWBCSIEN S XWBCSIEN=^TMP("XWBFGP",$J,"TODO","ORQQPX REMINDERS LIST")
  1. .S ^TMP("XWBFGP",$J,"TODO","ORQQPXRM REMINDERS APPLICABLE")=XWBCSIEN
  1. .S ^TMP("XWBFGP",$J,"TODO","ORQQPXRM REMINDERS UNEVALUATED")=XWBCSIEN
  1. .S ^TMP("XWBFGP",$J,"TODO","ORQQPXRM REMINDER CATEGORIES")=XWBCSIEN
  1. .Q
  1. Q
  1. ONECOVER ; called after data is returned to client
  1. I "^ORQQPXRM REMINDERS APPLICABLE^ORQQPXRM REMINDERS UNEVALUATED^ORQQPXRM REMINDER CATEGORIES^"[U_XWBCSRPC_U K ^TMP("XWBFGP",$J,"TODO","ORQQPX REMINDERS LIST")
  1. I XWBCSRPC="ORQQPX REMINDERS LIST" D
  1. .K ^TMP("XWBFGP",$J,"TODO","ORQQPXRM REMINDERS APPLICABLE")
  1. .K ^TMP("XWBFGP",$J,"TODO","ORQQPXRM REMINDERS UNEVALUATED")
  1. .K ^TMP("XWBFGP",$J,"TODO","ORQQPXRM REMINDER CATEGORIES")
  1. .Q
  1. ;
  1. K ^TMP("XWBFGP",$J,"TODO",XWBCSRPC),XWBCSRPC,XWBFGTIM
  1. I '$D(^TMP("XWBFGP",$J,"TODO")) D ENDCOVER
  1. Q
  1. ;
  1. ENDCOVER ; no more cover sheets to process, so set final values, clean up
  1. N I,NODE,X
  1. S NODE=^TMP("XWBFGP",$J,"NODE")
  1. S $P(^KMPTMP("KMPDT","ORWCV-FT",NODE),U,2)=$H
  1. K XWBCOVER,^TMP("XWBFGP",$J)
  1. ;