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

XOBVSKT.m

Go to the documentation of this file.
  1. XOBVSKT ;; mjk/alb - VistaLink Socket Methods ; 07/27/2002 13:00
  1. ;;1.5;VistALink;;Sep 09, 2005
  1. ;;Foundations Toolbox Release v1.5 [Build: 1.5.0.026]
  1. ;
  1. QUIT
  1. ;
  1. ; ------------------------------------------------------------------------------------
  1. ; Methods for Read fromto TCP/IP Socket
  1. ; ------------------------------------------------------------------------------------
  1. READ(XOBROOT,XOBREAD,XOBTO,XOBFIRST,XOBSTOP,XOBDATA,XOBHDLR) ;
  1. NEW X,EOT,OUT,STR,LINE,PIECES,DONE,TOFLAG,XOBCNT,XOBLEN,XOBBH,XOBEH,BS,ES,XOBOK,XOBX
  1. ;
  1. SET STR="",EOT=$CHAR(4),DONE=0,LINE=0,XOBOK=1
  1. ;
  1. ; -- READ tcp stream to global buffer | main calling tag NXTCALL^XOBVLL
  1. FOR READ XOBX#XOBREAD:XOBTO SET TOFLAG=$TEST DO:XOBFIRST CHK DO:'XOBSTOP!('DONE) QUIT:DONE
  1. . ;
  1. . ; -- if length of (new intake + current) is too large for buffer then store current
  1. . IF $LENGTH(STR)+$LENGTH(XOBX)>400 DO ADD(STR) SET STR=""
  1. . SET STR=STR_XOBX
  1. . ;
  1. . ; -- add node at each line-feed character
  1. . ; COMMENTED OUT: Not needed anymore, and has side effect of stripping out line feeds in input
  1. . ; array-type parameter values (in XML mode)
  1. . ; FOR QUIT:STR'[$CHAR(10) DO ADD($PIECE(STR,$CHAR(10))) SET STR=$PIECE(STR,$CHAR(10),2,999)
  1. . ;
  1. . ; -- if end-of-text marker found then wrap up and quit
  1. . IF STR[EOT SET STR=$PIECE(STR,EOT) DO ADD(STR) SET DONE=1 QUIT
  1. . ;
  1. . ; -- M XML parser cannot handle an element name split across nodes
  1. . SET PIECES=$LENGTH(STR,">")
  1. . IF PIECES>1 DO ADD($PIECE(STR,">",1,PIECES-1)_">") SET STR=$PIECE(STR,">",PIECES,999)
  1. ;
  1. QUIT XOBOK
  1. ;
  1. ADD(TXT) ; -- add new intake line
  1. SET LINE=LINE+1
  1. SET @XOBROOT@(LINE)=TXT
  1. QUIT
  1. ;
  1. CHK ; -- check if first read and change timeout and chars to read
  1. SET XOBFIRST=0
  1. ;
  1. ; -- abort if time out occurred and nothing was read
  1. IF 'TOFLAG,$GET(XOBX)="" SET XOBSTOP=1,DONE=1,XOBOK=0 QUIT
  1. ;
  1. ; -- intercept for transport sinks
  1. IF $EXTRACT(XOBX)'="<" DO SINK
  1. ;
  1. ; -- set up for subsequent reads
  1. SET XOBREAD=200,XOBTO=1
  1. QUIT
  1. ;
  1. ; ------------------------------------------------------------------------------------
  1. ; Execute Proprietary Format Reader
  1. ; ------------------------------------------------------------------------------------
  1. SINK ;
  1. ; -- get size of sink indicator >> then get sink indicator >> load req handler
  1. SET XOBHDLR=$$MSGSINK^XOBVRH($$GETSTR(+$$GETSTR(2,.XOBX),.XOBX),.XOBHDLR)
  1. ;
  1. ; -- execute proprietary stream reader
  1. IF $GET(XOBHDLR(XOBHDLR)) XECUTE $GET(XOBHDLR(XOBHDLR,"READER"))
  1. ;
  1. SET DONE=1
  1. QUIT
  1. ;
  1. ; -- get string of length LEN from stream buffer
  1. GETSTR(LEN,XOBUF) ;
  1. NEW X
  1. FOR QUIT:($LENGTH(XOBUF)'<LEN) DO RMORE(LEN-$LENGTH(XOBUF),.XOBUF)
  1. SET X=$EXTRACT(XOBUF,1,LEN)
  1. SET XOBUF=$EXTRACT(XOBUF,LEN+1,999)
  1. QUIT X
  1. ;
  1. ; -- read more from stream buffer but only needed amount
  1. RMORE(LEN,XOBUF) ;
  1. NEW X
  1. READ X#LEN:1 SET XOBUF=XOBUF_X
  1. QUIT
  1. ;
  1. ; ------------------------------------------------------------------------------------
  1. ; Methods for Openning and Closing Socket
  1. ; ------------------------------------------------------------------------------------
  1. OPEN(XOBPARMS) ; -- Open tcp/ip socket
  1. NEW I,POP
  1. SET POP=1
  1. ;
  1. ; -- set up os var
  1. DO OS
  1. ;
  1. ; -- preserve client io
  1. DO SAVDEV^%ZISUTL("XOB CLIENT")
  1. ;
  1. FOR I=1:1:XOBPARMS("RETRIES") DO CALL^%ZISTCP(XOBPARMS("ADDRESS"),XOBPARMS("PORT")) QUIT:'POP
  1. ; -- device open
  1. IF 'POP USE IO QUIT 1
  1. ; -- device not open
  1. QUIT 0
  1. ;
  1. CLOSE(XOBPARMS) ; -- close tcp/ip socket
  1. ; -- tell server to Stop() connection if close message is needed to close
  1. IF $GET(XOBPARMS("CLOSE MESSAGE"))]"" DO
  1. . DO PRE
  1. . DO WRITE($$XMLHDR^XOBVLIB()_XOBPARMS("CLOSE MESSAGE"))
  1. . DO POST
  1. ;
  1. DO FINAL
  1. DO CLOSE^%ZISTCP
  1. DO USE^%ZISUTL("XOB CLIENT")
  1. DO RMDEV^%ZISUTL("XOB CLIENT")
  1. QUIT
  1. ;
  1. INIT ; -- set up variables needed in tcp/ip processing
  1. KILL XOBNULL
  1. ;
  1. ; -- setup os var
  1. DO OS
  1. ;
  1. ; -- set RPC Broker os variable (so $$BROKER^XWBLIB returns true)
  1. SET XWBOS=XOBOS
  1. ;
  1. ; -- setup null device called "NULL"
  1. SET %ZIS="0H",IOP="NULL" DO ^%ZIS
  1. IF 'POP DO
  1. . SET XOBNULL=IO
  1. . DO SAVDEV^%ZISUTL("XOBNULL")
  1. QUIT
  1. ;
  1. OS ; -- os var
  1. SET XOBOS=$SELECT(^%ZOSF("OS")["OpenM":"OpenM",^("OS")["DSM":"DSM",^("OS")["UNIX":"UNIX",^("OS")["MSM":"MSM",1:"")
  1. QUIT
  1. ;
  1. FINAL ; -- kill variables used in tcp/ip processing
  1. ;
  1. ; -- close null device
  1. IF $DATA(XOBNULL) DO
  1. . DO USE^%ZISUTL("XOBNULL")
  1. . DO CLOSE^%ZISUTL("XOBNULL")
  1. . KILL XOBNULL
  1. ;
  1. KILL XOBOS,XWBOS
  1. ;
  1. QUIT
  1. ;
  1. ; ------------------------------------------------------------------------------------
  1. ; Methods for Writing to TCP/IP Socket
  1. ; ------------------------------------------------------------------------------------
  1. PRE ; -- prepare socket for writing
  1. SET $X=0
  1. QUIT
  1. ;
  1. WRITE(STR) ; -- Write a data string to socket
  1. IF XOBOS="MSM" WRITE STR QUIT
  1. ;
  1. ; -- handle a short string
  1. IF $LENGTH(STR)<511 DO:($X+$LENGTH(STR))>511 FLUSH WRITE STR QUIT
  1. ;
  1. ; -- handle a long string
  1. DO FLUSH
  1. FOR QUIT:'$LENGTH(STR) WRITE $EXTRACT(STR,1,511) DO FLUSH SET STR=$EXTRACT(STR,512,99999)
  1. ;
  1. QUIT
  1. ;
  1. POST ; -- send eot and flush socket buffer
  1. DO WRITE($CHAR(4))
  1. DO FLUSH
  1. QUIT
  1. ;
  1. FLUSH ; flush buffer
  1. IF XOBOS="OpenM" WRITE ! QUIT
  1. IF XOBOS="DSM" WRITE:$X>0 ! QUIT
  1. ;IF XOBOS="GTM" WRITE # QUIT
  1. QUIT
  1. ;