- XWBRPC ;OIFO-Oakland/REM - M2M Broker Server MRH ;08/20/2002 12:13
- ;;1.1;RPC BROKER;**28,34**;Mar 28, 1997
- ;
- QUIT
- ;
- ; ---------------------------------------------------------------------
- ; RPC Server: Message Request Handler (MRH)
- ; ---------------------------------------------------------------------
- ;
- ;p34 -added $$CHARCHK^XWBUTL before writing to WRITE^XWBRL to escape CR - PROCESS.
- ; -remove $C(13). CR were not being stripped out in result - PROCESS.
- ;
- ;
- EN(XWBDATA) ; -- handle parsed messages request
- NEW RPC0,RPCURI,RPCIEN,TAG,ROU,METHSIG,XWBR
- ;
- IF $G(XWBDATA("URI"))="" DO GOTO ENQ
- . DO ERROR(1,"NONE","No Remote Procedure Specified.")
- ;
- SET RPCURI=XWBDATA("URI")
- ;
- SET U="^"
- ;May want to build/call common broker api for RPC lookup. See XWBBRK
- SET RPCIEN=$O(^XWB(8994,"B",RPCURI,""))
- IF RPCIEN'>0 DO GOTO ENQ
- . DO ERROR(2,RPCURI,"Remote Procedure Unknown: "_RPCURI_" cannot be found.")
- .D ERROR^XWBM2MC(7) ;Write error in TMP **M2M
- ;
- SET RPC0=$GET(^XWB(8994,RPCIEN,0))
- IF RPC0="" DO GOTO ENQ
- . DO ERROR(3,RPCURI,"Remote Procedure Blank: '"_RPCURI_"' contains no information.")
- ;
- SET RPCURI=$P(RPC0,U)
- SET TAG=$P(RPC0,U,2)
- SET ROU=$P(RPC0,U,3)
- ;
- ; -- check inactive flag
- IF $P(RPC0,U,6)=1!($P(RPC0,U,6)=2) DO GOTO ENQ
- . DO ERROR(4,RPCURI,"Remote Procedure InActive: '"_RPCURI_"' cannot be run at this time.")
- ;
- SET XWBPTYPE=$P(RPC0,U,4)
- SET XWBWRAP=$P(RPC0,U,8)
- ;
- ; -- build method signature and call rpc
- SET METHSIG=TAG_"^"_ROU_"(.XWBR"_$G(XWBDATA("PARAMS"))_")"
- ;
- I $G(XWBDEBUG) D LOG(METHSIG)
- ;See that the NULL device is current
- DO @METHSIG
- ;
- ; -- send results
- D USE^%ZISUTL("XWBM2M SERVER") U IO ;**M2M use server IO
- ;
- I $G(XWBDEBUG) D LOG(.XWBR)
- DO SEND(.XWBR)
- ;
- ENQ ; -- end message handler
- DO CLEAN
- ;
- QUIT
- ;
- CLEAN ; -- clean up message handler environment
- NEW POS
- ; -- kill parameters
- SET POS=0
- FOR S POS=$O(XWBDATA("PARAMS",POS)) Q:'POS K @XWBDATA("PARAMS",POS)
- Q
- ;
- SEND(XWBR) ; -- stream rpc data to client
- NEW XWBFMT,XWBFILL
- SET XWBFMT=$$GETFMT()
- ; -- prepare socket for writing
- DO PRE^XWBRL
- ; -- initialize
- DO WRITE^XWBRL($$XMLHDR^XWBUTL())
- ;DO DOCTYPE
- DO WRITE^XWBRL("<vistalink type=""Gov.VA.Med.RPC.Response"" ><results type="""_XWBFMT_""" ><![CDATA[")
- ; -- results
- DO PROCESS
- ; -- finalize
- DO WRITE^XWBRL("]]></results></vistalink>")
- ; -- send eot and flush buffer
- DO POST^XWBRL
- ;
- QUIT
- ;
- DOCTYPE ;
- DO WRITE^XWBRL("<!DOCTYPE vistalink [<!ELEMENT vistalink (results) ><!ELEMENT results (#PCDATA)><!ATTLIST vistalink type CDATA ""Gov.VA.Med.RPC.Response"" ><!ATTLIST results type (array|string) >]>")
- QUIT
- ;
- GETFMT() ; -- determine response format type
- IF XWBPTYPE=1!(XWBPTYPE=5)!(XWBPTYPE=6) QUIT "string"
- IF XWBPTYPE=2 QUIT "array"
- ;
- QUIT $S(XWBWRAP:"array",1:"string")
- ;
- PROCESS ; -- send the real results
- NEW I,T,DEL,V
- ;
- ;*p34-Remove $C(13). CR were not being stripped out in results to escape CR.
- ;S DEL=$S(XWBMODE="RPCBroker":$C(13,10),1:$C(10))
- S DEL=$S(XWBMODE="RPCBroker":$C(10),1:$C(10))
- ;
- ;*p34-When write XWBR, go thru $$CHARCHK^XWBUTL first.
- ; -- single value
- IF XWBPTYPE=1 SET XWBR=$G(XWBR) DO WRITE^XWBRL($$CHARCHK^XWBUTL($G(XWBR))) QUIT
- ; -- table delimited by CR+LF - ARRAY
- IF XWBPTYPE=2 DO QUIT
- . SET I="" FOR SET I=$O(XWBR(I)) QUIT:I="" DO WRITE^XWBRL($$CHARCHK^XWBUTL($G(XWBR(I)))),WRITE^XWBRL(DEL)
- ; -- word processing
- IF XWBPTYPE=3 DO QUIT
- . SET I="" FOR SET I=$O(XWBR(I)) QUIT:I="" DO WRITE^XWBRL($$CHARCHK^XWBUTL($G(XWBR(I)))) DO:XWBWRAP WRITE^XWBRL(DEL)
- ; -- global array
- IF XWBPTYPE=4 DO QUIT
- . SET I=$G(XWBR) QUIT:I="" SET T=$E(I,1,$L(I)-1)
- . I $D(@I)>10 S V=@I D WRITE^XWBRL($$CHARCHK^XWBUTL($G(V)))
- . FOR SET I=$Q(@I) QUIT:I=""!(I'[T) S V=@I D WRITE^XWBRL($$CHARCHK^XWBUTL($G(V))) D:XWBWRAP&(V'=DEL) WRITE^XWBRL(DEL)
- . IF $D(@XWBR) KILL @XWBR
- ; -- global instance
- IF XWBPTYPE=5 S XWBR=$G(@XWBR) D WRITE^XWBRL($$CHARCHK^XWBUTL($G(XWBR))) QUIT
- ; -- variable length records only good up to 255 char)
- IF XWBPTYPE=6 SET I="" FOR SET I=$O(XWBR(I)) QUIT:I="" DO WRITE^XWBRL($C($L(XWBR(I)))),WRITE^XWBRL(XWBR(I))
- QUIT
- ;
- ERROR(CODE,RPCURI,MSG) ; -- send rpc application error
- DO PRE^XWBRL
- DO WRITE^XWBRL($$XMLHDR^XWBUTL())
- DO WRITE^XWBRL("<vistalink type=""VA.RPC.Error"" >")
- DO WRITE^XWBRL("<errors>")
- DO WRITE^XWBRL("<error code="""_CODE_""" uri="""_$G(RPCURI)_""" >")
- DO WRITE^XWBRL("<msg>"_$G(MSG)_"</msg>")
- DO WRITE^XWBRL("</error>")
- DO WRITE^XWBRL("</errors>")
- DO WRITE^XWBRL("</vistalink>")
- ; -- send eot and flush buffer
- DO POST^XWBRL
- QUIT
- ;
- ; ---------------------------------------------------------------------
- ; RPC Server: Request Message XML SAX Parser Callbacks
- ; ---------------------------------------------------------------------
- ELEST(ELE,ATR) ; -- element start event handler
- IF ELE="vistalink" KILL XWBSESS,XWBPARAM,XWBPN,XWBPTYPE QUIT
- ;
- IF ELE="rpc" SET XWBDATA("URI")=$$ESC^XWBRMX($G(ATR("uri"),"##Unkown RPC##")) QUIT
- ;
- IF ELE="param" DO QUIT
- . SET XWBPARAM=1
- . SET XWBPN="XWBP"_ATR("position")
- . SET XWBDATA("PARAMS",ATR("position"))=XWBPN
- . SET XWBPTYPE=ATR("type")
- . S XWBCHRST="" ;To accumulate char
- ;
- IF ELE="index" DO QUIT
- . ;SET @XWBPN@($$ESC^XWBRMX(ATR("name")))=$$ESC^XWBRMX(ATR("value"))
- . S XWBPN("name")=$$ESC^XWBRMX(ATR("name")) ;rwf
- . S XWBCHRST=""
- ;
- QUIT
- ;
- ELEND(ELE) ; -- element end event handler
- IF ELE="vistalink" KILL XWBPOS,XWBSESS,XWBPARAM,XWBPN,XWBPTYPE,XWBCHRST QUIT
- ;
- IF ELE="params" DO QUIT
- . NEW POS,PARAMS
- . SET PARAMS="",POS=0
- . FOR SET POS=$O(XWBDATA("PARAMS",POS)) Q:'POS SET PARAMS=PARAMS_",."_XWBDATA("PARAMS",POS)
- . SET XWBDATA("PARAMS")=PARAMS
- ;
- IF ELE="param" D Q
- . I $G(XWBDEBUG),$D(XWBPN),$D(@XWBPN) D LOG(.@XWBPN)
- . KILL XWBPARAM,XWBCHRST
- ;
- QUIT
- ;
- ;This can be called more than once for one TEXT string.
- CHR(TEXT) ; -- character value event handler <tag>TEXT</tag)
- ;
- IF $G(XWBPARAM) DO
- . ;What to do if string gets too long?
- . ;IF XWBPTYPE="string" SET XWBCHRST=XWBCHRST_$$ESC^XWBRMX(TEXT),@XWBPN=XWBCHRST QUIT
- . IF XWBPTYPE="string" SET XWBCHRST=XWBCHRST_TEXT,@XWBPN=XWBCHRST QUIT
- . ;IF XWBPTYPE="ref" SET @XWBPN=$G(@$$ESC^XWBRMX(TEXT)) QUIT
- . IF XWBPTYPE="ref" SET XWBCHRST=XWBCHRST_TEXT,@XWBPN=@XWBCHRST QUIT
- . I XWBPTYPE="array" S XWBCHRST=XWBCHRST_TEXT,@XWBPN@(XWBPN("name"))=XWBCHRST Q ;rwf
- QUIT
- ;
- ; ---------------------------------------------------------------------
- ; Parse Results of Successful Legacy RPC Request
- ; ---------------------------------------------------------------------
- ;
- ; [Public/Supported Method]
- PARSE(XWBPARMS,XWBY) ; -- parse legacy rpc results ; uses SAX parser
- NEW XWBCHK,XWBOPT,XWBTYPE,XWBCNT
- ;
- ;**M2M Result will go here.
- I XWBY="" D
- .IF $G(XWBY)="" SET XWBY=$NA(^TMP("XWBM2MRPC",$J,"RESULTS"))
- .SET XWBYX=XWBY
- .KILL @XWBYX
- ;
- DO SET
- SET XWBOPT=""
- DO EN^MXMLPRSE(XWBPARMS("RESULTS"),.XWBCBK,.XWBOPT)
- Q
- ;
- SET ; -- set the event interface entry points ;
- SET XWBCBK("STARTELEMENT")="RESELEST^XWBRPC"
- SET XWBCBK("ENDELEMENT")="RESELEND^XWBRPC"
- SET XWBCBK("CHARACTERS")="RESCHR^XWBRPC"
- QUIT
- ;
- RESELEST(ELE,ATR) ; -- element start event handler
- IF ELE="results" SET XWBTYPE=$G(ATR("type")),XWBCNT=0
- QUIT
- ;
- RESELEND(ELE) ; -- element end event handler
- KILL XWBCNT,XWBTYPE
- QUIT
- ;
- RESCHR(TEXT) ; -- character value event handler
- QUIT:$G(XWBTYPE)=""
- QUIT:'$L(TEXT) ; -- Sometimes sends in empty string
- ;
- IF XWBCNT=0,TEXT=$C(10) QUIT ; -- bug in parser? always starts with $C(10)
- ;
- IF XWBTYPE="string" DO QUIT
- . SET XWBCNT=XWBCNT+1
- . SET @XWBY@(XWBCNT)=TEXT
- ;
- IF XWBTYPE="array" DO
- . SET XWBCNT=XWBCNT+1
- . SET @XWBY@(XWBCNT)=$P(TEXT,$C(10))
- QUIT
- ;
- PARSEX(XWBPARMS,XWBY) ; -- parse legacy rpc results ; uses DOM parser
- NEW XWBDOM
- SET XWBDOM=$$EN^MXMLDOM(XWBPARMS("RESULTS"),"")
- DO TEXT^MXMLDOM(XWBDOM,2,XWBY)
- DO DELETE^MXMLDOM(XWBDOM)
- QUIT
- ;
- LOG(MSG) ;Debug log
- N CNT
- S CNT=$G(^TMP("XWBM2ML",$J))+1,^($J)=CNT
- M ^TMP("XWBM2ML",$J,CNT)=MSG
- Q
- ;
- ; -------------------------------------------------------------------
- ; Response Format Documentation
- ; -------------------------------------------------------------------
- ;
- ;
- ; [ Sample XML produced by a successful call of EN^XWBRPC(.XWBPARMS).
- ; SEND^XWBRPC does the actual work to produce response. ]
- ;
- ; <?xml version="1.0" encoding="utf-8" ?>
- ; <vistalink type="Gov.VA.Med.RPC.Response" >
- ; <results type="array" >
- ; <![CDATA[4261;;2961001.08^2^274^166^105^^2961001.1123^1^^9^2^8^10^^^^^^^10G1-ALN
- ; 4270;;2961002.08^2^274^166^112^^^1^^9^2^8^10^^^^^^^10G8-ALN
- ; 4274;;2961003.08^2^274^166^116^^^1^^9^2^8^10^^^^^^^10GD-ALN
- ; 4340;;2961117.08^2^274^166^182^^2961118.1425^1^^9^2^8^10^^^^^^^10K0-ALN
- ; 4342;;2961108.13^2^108^207^183^^2961118.1546^1^^9^2^8^10^^^^^^^10K2-ALN
- ; 6394;;3000607.084^2^165^68^6479^^3000622.13^1^^9^1^8^10^^^^^^^197M-ALN]]>
- ; </results>
- ; </vistalink>
- ;
- ; -------------------------------------------------------------------
- ;
- ; [ Sample XML produced by a unsuccessful call of EN^XWBRPC(.XWBPARMS).
- ; ERROR^XWBRPC does the actual work to produce response. ]
- ;
- ; <?xml version="1.0" encoding="utf-8" ?>
- ; <vistalink type="Gov.VA..Med.RPC.Error" >
- ; <errors>
- ; <error code="2" uri="XWB BAD NAME" >
- ; <msg>
- ; Remote Procedure Unknown: 'XWB BAD NAME' cannot be found.
- ; </msg>
- ; </error>
- ; </errors>
- ; </vistalink>
- ;
- ; -------------------------------------------------------------------
- ;
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXWBRPC 9931 printed Mar 13, 2025@21:42:16 Page 2
- XWBRPC ;OIFO-Oakland/REM - M2M Broker Server MRH ;08/20/2002 12:13
- +1 ;;1.1;RPC BROKER;**28,34**;Mar 28, 1997
- +2 ;
- +3 QUIT
- +4 ;
- +5 ; ---------------------------------------------------------------------
- +6 ; RPC Server: Message Request Handler (MRH)
- +7 ; ---------------------------------------------------------------------
- +8 ;
- +9 ;p34 -added $$CHARCHK^XWBUTL before writing to WRITE^XWBRL to escape CR - PROCESS.
- +10 ; -remove $C(13). CR were not being stripped out in result - PROCESS.
- +11 ;
- +12 ;
- EN(XWBDATA) ; -- handle parsed messages request
- +1 NEW RPC0,RPCURI,RPCIEN,TAG,ROU,METHSIG,XWBR
- +2 ;
- +3 IF $GET(XWBDATA("URI"))=""
- Begin DoDot:1
- +4 DO ERROR(1,"NONE","No Remote Procedure Specified.")
- End DoDot:1
- GOTO ENQ
- +5 ;
- +6 SET RPCURI=XWBDATA("URI")
- +7 ;
- +8 SET U="^"
- +9 ;May want to build/call common broker api for RPC lookup. See XWBBRK
- +10 SET RPCIEN=$ORDER(^XWB(8994,"B",RPCURI,""))
- +11 IF RPCIEN'>0
- Begin DoDot:1
- +12 DO ERROR(2,RPCURI,"Remote Procedure Unknown: "_RPCURI_" cannot be found.")
- +13 ;Write error in TMP **M2M
- DO ERROR^XWBM2MC(7)
- End DoDot:1
- GOTO ENQ
- +14 ;
- +15 SET RPC0=$GET(^XWB(8994,RPCIEN,0))
- +16 IF RPC0=""
- Begin DoDot:1
- +17 DO ERROR(3,RPCURI,"Remote Procedure Blank: '"_RPCURI_"' contains no information.")
- End DoDot:1
- GOTO ENQ
- +18 ;
- +19 SET RPCURI=$PIECE(RPC0,U)
- +20 SET TAG=$PIECE(RPC0,U,2)
- +21 SET ROU=$PIECE(RPC0,U,3)
- +22 ;
- +23 ; -- check inactive flag
- +24 IF $PIECE(RPC0,U,6)=1!($PIECE(RPC0,U,6)=2)
- Begin DoDot:1
- +25 DO ERROR(4,RPCURI,"Remote Procedure InActive: '"_RPCURI_"' cannot be run at this time.")
- End DoDot:1
- GOTO ENQ
- +26 ;
- +27 SET XWBPTYPE=$PIECE(RPC0,U,4)
- +28 SET XWBWRAP=$PIECE(RPC0,U,8)
- +29 ;
- +30 ; -- build method signature and call rpc
- +31 SET METHSIG=TAG_"^"_ROU_"(.XWBR"_$GET(XWBDATA("PARAMS"))_")"
- +32 ;
- +33 IF $GET(XWBDEBUG)
- DO LOG(METHSIG)
- +34 ;See that the NULL device is current
- +35 DO @METHSIG
- +36 ;
- +37 ; -- send results
- +38 ;**M2M use server IO
- DO USE^%ZISUTL("XWBM2M SERVER")
- USE IO
- +39 ;
- +40 IF $GET(XWBDEBUG)
- DO LOG(.XWBR)
- +41 DO SEND(.XWBR)
- +42 ;
- ENQ ; -- end message handler
- +1 DO CLEAN
- +2 ;
- +3 QUIT
- +4 ;
- CLEAN ; -- clean up message handler environment
- +1 NEW POS
- +2 ; -- kill parameters
- +3 SET POS=0
- +4 FOR
- SET POS=$ORDER(XWBDATA("PARAMS",POS))
- if 'POS
- QUIT
- KILL @XWBDATA("PARAMS",POS)
- +5 QUIT
- +6 ;
- SEND(XWBR) ; -- stream rpc data to client
- +1 NEW XWBFMT,XWBFILL
- +2 SET XWBFMT=$$GETFMT()
- +3 ; -- prepare socket for writing
- +4 DO PRE^XWBRL
- +5 ; -- initialize
- +6 DO WRITE^XWBRL($$XMLHDR^XWBUTL())
- +7 ;DO DOCTYPE
- +8 DO WRITE^XWBRL("<vistalink type=""Gov.VA.Med.RPC.Response"" ><results type="""_XWBFMT_""" ><![CDATA[")
- +9 ; -- results
- +10 DO PROCESS
- +11 ; -- finalize
- +12 DO WRITE^XWBRL("]]></results></vistalink>")
- +13 ; -- send eot and flush buffer
- +14 DO POST^XWBRL
- +15 ;
- +16 QUIT
- +17 ;
- DOCTYPE ;
- +1 DO WRITE^XWBRL("<!DOCTYPE vistalink [<!ELEMENT vistalink (results) ><!ELEMENT results (#PCDATA)><!ATTLIST vistalink type CDATA ""Gov.VA.Med.RPC.Response"" ><!ATTLIST results type (array|string) >]>")
- +2 QUIT
- +3 ;
- GETFMT() ; -- determine response format type
- +1 IF XWBPTYPE=1!(XWBPTYPE=5)!(XWBPTYPE=6)
- QUIT "string"
- +2 IF XWBPTYPE=2
- QUIT "array"
- +3 ;
- +4 QUIT $SELECT(XWBWRAP:"array",1:"string")
- +5 ;
- PROCESS ; -- send the real results
- +1 NEW I,T,DEL,V
- +2 ;
- +3 ;*p34-Remove $C(13). CR were not being stripped out in results to escape CR.
- +4 ;S DEL=$S(XWBMODE="RPCBroker":$C(13,10),1:$C(10))
- +5 SET DEL=$SELECT(XWBMODE="RPCBroker":$CHAR(10),1:$CHAR(10))
- +6 ;
- +7 ;*p34-When write XWBR, go thru $$CHARCHK^XWBUTL first.
- +8 ; -- single value
- +9 IF XWBPTYPE=1
- SET XWBR=$GET(XWBR)
- DO WRITE^XWBRL($$CHARCHK^XWBUTL($GET(XWBR)))
- QUIT
- +10 ; -- table delimited by CR+LF - ARRAY
- +11 IF XWBPTYPE=2
- Begin DoDot:1
- +12 SET I=""
- FOR
- SET I=$ORDER(XWBR(I))
- if I=""
- QUIT
- DO WRITE^XWBRL($$CHARCHK^XWBUTL($GET(XWBR(I))))
- DO WRITE^XWBRL(DEL)
- End DoDot:1
- QUIT
- +13 ; -- word processing
- +14 IF XWBPTYPE=3
- Begin DoDot:1
- +15 SET I=""
- FOR
- SET I=$ORDER(XWBR(I))
- if I=""
- QUIT
- DO WRITE^XWBRL($$CHARCHK^XWBUTL($GET(XWBR(I))))
- if XWBWRAP
- DO WRITE^XWBRL(DEL)
- End DoDot:1
- QUIT
- +16 ; -- global array
- +17 IF XWBPTYPE=4
- Begin DoDot:1
- +18 SET I=$GET(XWBR)
- if I=""
- QUIT
- SET T=$EXTRACT(I,1,$LENGTH(I)-1)
- +19 IF $DATA(@I)>10
- SET V=@I
- DO WRITE^XWBRL($$CHARCHK^XWBUTL($GET(V)))
- +20 FOR
- SET I=$QUERY(@I)
- if I=""!(I'[T)
- QUIT
- SET V=@I
- DO WRITE^XWBRL($$CHARCHK^XWBUTL($GET(V)))
- if XWBWRAP&(V'=DEL)
- DO WRITE^XWBRL(DEL)
- +21 IF $DATA(@XWBR)
- KILL @XWBR
- End DoDot:1
- QUIT
- +22 ; -- global instance
- +23 IF XWBPTYPE=5
- SET XWBR=$GET(@XWBR)
- DO WRITE^XWBRL($$CHARCHK^XWBUTL($GET(XWBR)))
- QUIT
- +24 ; -- variable length records only good up to 255 char)
- +25 IF XWBPTYPE=6
- SET I=""
- FOR
- SET I=$ORDER(XWBR(I))
- if I=""
- QUIT
- DO WRITE^XWBRL($CHAR($LENGTH(XWBR(I))))
- DO WRITE^XWBRL(XWBR(I))
- +26 QUIT
- +27 ;
- ERROR(CODE,RPCURI,MSG) ; -- send rpc application error
- +1 DO PRE^XWBRL
- +2 DO WRITE^XWBRL($$XMLHDR^XWBUTL())
- +3 DO WRITE^XWBRL("<vistalink type=""VA.RPC.Error"" >")
- +4 DO WRITE^XWBRL("<errors>")
- +5 DO WRITE^XWBRL("<error code="""_CODE_""" uri="""_$GET(RPCURI)_""" >")
- +6 DO WRITE^XWBRL("<msg>"_$GET(MSG)_"</msg>")
- +7 DO WRITE^XWBRL("</error>")
- +8 DO WRITE^XWBRL("</errors>")
- +9 DO WRITE^XWBRL("</vistalink>")
- +10 ; -- send eot and flush buffer
- +11 DO POST^XWBRL
- +12 QUIT
- +13 ;
- +14 ; ---------------------------------------------------------------------
- +15 ; RPC Server: Request Message XML SAX Parser Callbacks
- +16 ; ---------------------------------------------------------------------
- ELEST(ELE,ATR) ; -- element start event handler
- +1 IF ELE="vistalink"
- KILL XWBSESS,XWBPARAM,XWBPN,XWBPTYPE
- QUIT
- +2 ;
- +3 IF ELE="rpc"
- SET XWBDATA("URI")=$$ESC^XWBRMX($GET(ATR("uri"),"##Unkown RPC##"))
- QUIT
- +4 ;
- +5 IF ELE="param"
- Begin DoDot:1
- +6 SET XWBPARAM=1
- +7 SET XWBPN="XWBP"_ATR("position")
- +8 SET XWBDATA("PARAMS",ATR("position"))=XWBPN
- +9 SET XWBPTYPE=ATR("type")
- +10 ;To accumulate char
- SET XWBCHRST=""
- End DoDot:1
- QUIT
- +11 ;
- +12 IF ELE="index"
- Begin DoDot:1
- +13 ;SET @XWBPN@($$ESC^XWBRMX(ATR("name")))=$$ESC^XWBRMX(ATR("value"))
- +14 ;rwf
- SET XWBPN("name")=$$ESC^XWBRMX(ATR("name"))
- +15 SET XWBCHRST=""
- End DoDot:1
- QUIT
- +16 ;
- +17 QUIT
- +18 ;
- ELEND(ELE) ; -- element end event handler
- +1 IF ELE="vistalink"
- KILL XWBPOS,XWBSESS,XWBPARAM,XWBPN,XWBPTYPE,XWBCHRST
- QUIT
- +2 ;
- +3 IF ELE="params"
- Begin DoDot:1
- +4 NEW POS,PARAMS
- +5 SET PARAMS=""
- SET POS=0
- +6 FOR
- SET POS=$ORDER(XWBDATA("PARAMS",POS))
- if 'POS
- QUIT
- SET PARAMS=PARAMS_",."_XWBDATA("PARAMS",POS)
- +7 SET XWBDATA("PARAMS")=PARAMS
- End DoDot:1
- QUIT
- +8 ;
- +9 IF ELE="param"
- Begin DoDot:1
- +10 IF $GET(XWBDEBUG)
- IF $DATA(XWBPN)
- IF $DATA(@XWBPN)
- DO LOG(.@XWBPN)
- +11 KILL XWBPARAM,XWBCHRST
- End DoDot:1
- QUIT
- +12 ;
- +13 QUIT
- +14 ;
- +15 ;This can be called more than once for one TEXT string.
- CHR(TEXT) ; -- character value event handler <tag>TEXT</tag)
- +1 ;
- +2 IF $GET(XWBPARAM)
- Begin DoDot:1
- +3 ;What to do if string gets too long?
- +4 ;IF XWBPTYPE="string" SET XWBCHRST=XWBCHRST_$$ESC^XWBRMX(TEXT),@XWBPN=XWBCHRST QUIT
- +5 IF XWBPTYPE="string"
- SET XWBCHRST=XWBCHRST_TEXT
- SET @XWBPN=XWBCHRST
- QUIT
- +6 ;IF XWBPTYPE="ref" SET @XWBPN=$G(@$$ESC^XWBRMX(TEXT)) QUIT
- +7 IF XWBPTYPE="ref"
- SET XWBCHRST=XWBCHRST_TEXT
- SET @XWBPN=@XWBCHRST
- QUIT
- +8 ;rwf
- IF XWBPTYPE="array"
- SET XWBCHRST=XWBCHRST_TEXT
- SET @XWBPN@(XWBPN("name"))=XWBCHRST
- QUIT
- End DoDot:1
- +9 QUIT
- +10 ;
- +11 ; ---------------------------------------------------------------------
- +12 ; Parse Results of Successful Legacy RPC Request
- +13 ; ---------------------------------------------------------------------
- +14 ;
- +15 ; [Public/Supported Method]
- PARSE(XWBPARMS,XWBY) ; -- parse legacy rpc results ; uses SAX parser
- +1 NEW XWBCHK,XWBOPT,XWBTYPE,XWBCNT
- +2 ;
- +3 ;**M2M Result will go here.
- +4 IF XWBY=""
- Begin DoDot:1
- +5 IF $GET(XWBY)=""
- SET XWBY=$NAME(^TMP("XWBM2MRPC",$JOB,"RESULTS"))
- +6 SET XWBYX=XWBY
- +7 KILL @XWBYX
- End DoDot:1
- +8 ;
- +9 DO SET
- +10 SET XWBOPT=""
- +11 DO EN^MXMLPRSE(XWBPARMS("RESULTS"),.XWBCBK,.XWBOPT)
- +12 QUIT
- +13 ;
- SET ; -- set the event interface entry points ;
- +1 SET XWBCBK("STARTELEMENT")="RESELEST^XWBRPC"
- +2 SET XWBCBK("ENDELEMENT")="RESELEND^XWBRPC"
- +3 SET XWBCBK("CHARACTERS")="RESCHR^XWBRPC"
- +4 QUIT
- +5 ;
- RESELEST(ELE,ATR) ; -- element start event handler
- +1 IF ELE="results"
- SET XWBTYPE=$GET(ATR("type"))
- SET XWBCNT=0
- +2 QUIT
- +3 ;
- RESELEND(ELE) ; -- element end event handler
- +1 KILL XWBCNT,XWBTYPE
- +2 QUIT
- +3 ;
- RESCHR(TEXT) ; -- character value event handler
- +1 if $GET(XWBTYPE)=""
- QUIT
- +2 ; -- Sometimes sends in empty string
- if '$LENGTH(TEXT)
- QUIT
- +3 ;
- +4 ; -- bug in parser? always starts with $C(10)
- IF XWBCNT=0
- IF TEXT=$CHAR(10)
- QUIT
- +5 ;
- +6 IF XWBTYPE="string"
- Begin DoDot:1
- +7 SET XWBCNT=XWBCNT+1
- +8 SET @XWBY@(XWBCNT)=TEXT
- End DoDot:1
- QUIT
- +9 ;
- +10 IF XWBTYPE="array"
- Begin DoDot:1
- +11 SET XWBCNT=XWBCNT+1
- +12 SET @XWBY@(XWBCNT)=$PIECE(TEXT,$CHAR(10))
- End DoDot:1
- +13 QUIT
- +14 ;
- PARSEX(XWBPARMS,XWBY) ; -- parse legacy rpc results ; uses DOM parser
- +1 NEW XWBDOM
- +2 SET XWBDOM=$$EN^MXMLDOM(XWBPARMS("RESULTS"),"")
- +3 DO TEXT^MXMLDOM(XWBDOM,2,XWBY)
- +4 DO DELETE^MXMLDOM(XWBDOM)
- +5 QUIT
- +6 ;
- LOG(MSG) ;Debug log
- +1 NEW CNT
- +2 SET CNT=$GET(^TMP("XWBM2ML",$JOB))+1
- SET ^($JOB)=CNT
- +3 MERGE ^TMP("XWBM2ML",$JOB,CNT)=MSG
- +4 QUIT
- +5 ;
- +6 ; -------------------------------------------------------------------
- +7 ; Response Format Documentation
- +8 ; -------------------------------------------------------------------
- +9 ;
- +10 ;
- +11 ; [ Sample XML produced by a successful call of EN^XWBRPC(.XWBPARMS).
- +12 ; SEND^XWBRPC does the actual work to produce response. ]
- +13 ;
- +14 ; <?xml version="1.0" encoding="utf-8" ?>
- +15 ; <vistalink type="Gov.VA.Med.RPC.Response" >
- +16 ; <results type="array" >
- +17 ; <![CDATA[4261;;2961001.08^2^274^166^105^^2961001.1123^1^^9^2^8^10^^^^^^^10G1-ALN
- +18 ; 4270;;2961002.08^2^274^166^112^^^1^^9^2^8^10^^^^^^^10G8-ALN
- +19 ; 4274;;2961003.08^2^274^166^116^^^1^^9^2^8^10^^^^^^^10GD-ALN
- +20 ; 4340;;2961117.08^2^274^166^182^^2961118.1425^1^^9^2^8^10^^^^^^^10K0-ALN
- +21 ; 4342;;2961108.13^2^108^207^183^^2961118.1546^1^^9^2^8^10^^^^^^^10K2-ALN
- +22 ; 6394;;3000607.084^2^165^68^6479^^3000622.13^1^^9^1^8^10^^^^^^^197M-ALN]]>
- +23 ; </results>
- +24 ; </vistalink>
- +25 ;
- +26 ; -------------------------------------------------------------------
- +27 ;
- +28 ; [ Sample XML produced by a unsuccessful call of EN^XWBRPC(.XWBPARMS).
- +29 ; ERROR^XWBRPC does the actual work to produce response. ]
- +30 ;
- +31 ; <?xml version="1.0" encoding="utf-8" ?>
- +32 ; <vistalink type="Gov.VA..Med.RPC.Error" >
- +33 ; <errors>
- +34 ; <error code="2" uri="XWB BAD NAME" >
- +35 ; <msg>
- +36 ; Remote Procedure Unknown: 'XWB BAD NAME' cannot be found.
- +37 ; </msg>
- +38 ; </error>
- +39 ; </errors>
- +40 ; </vistalink>
- +41 ;
- +42 ; -------------------------------------------------------------------
- +43 ;