| 1 | XOBVSKT ;; mjk/alb - VistaLink Socket Methods ; 07/27/2002  13:00 | 
|---|
| 2 | ;;1.5;VistALink;;Sep 09, 2005 | 
|---|
| 3 | ;;Foundations Toolbox Release v1.5 [Build: 1.5.0.026] | 
|---|
| 4 | ; | 
|---|
| 5 | QUIT | 
|---|
| 6 | ; | 
|---|
| 7 | ; ------------------------------------------------------------------------------------ | 
|---|
| 8 | ;                          Methods for Read fromto TCP/IP Socket | 
|---|
| 9 | ; ------------------------------------------------------------------------------------ | 
|---|
| 10 | READ(XOBROOT,XOBREAD,XOBTO,XOBFIRST,XOBSTOP,XOBDATA,XOBHDLR) ; | 
|---|
| 11 | NEW X,EOT,OUT,STR,LINE,PIECES,DONE,TOFLAG,XOBCNT,XOBLEN,XOBBH,XOBEH,BS,ES,XOBOK,XOBX | 
|---|
| 12 | ; | 
|---|
| 13 | SET STR="",EOT=$CHAR(4),DONE=0,LINE=0,XOBOK=1 | 
|---|
| 14 | ; | 
|---|
| 15 | ; -- READ tcp stream to global buffer | main calling tag NXTCALL^XOBVLL | 
|---|
| 16 | FOR  READ XOBX#XOBREAD:XOBTO SET TOFLAG=$TEST DO:XOBFIRST CHK DO:'XOBSTOP!('DONE)  QUIT:DONE | 
|---|
| 17 | . ; | 
|---|
| 18 | . ; -- if length of (new intake + current) is too large for buffer then store current | 
|---|
| 19 | . IF $LENGTH(STR)+$LENGTH(XOBX)>400 DO ADD(STR) SET STR="" | 
|---|
| 20 | . SET STR=STR_XOBX | 
|---|
| 21 | . ; | 
|---|
| 22 | . ; -- add node at each line-feed character | 
|---|
| 23 | . ; COMMENTED OUT: Not needed anymore, and has side effect of stripping out line feeds in input | 
|---|
| 24 | . ;                array-type parameter values (in XML mode) | 
|---|
| 25 | . ; FOR  QUIT:STR'[$CHAR(10)  DO ADD($PIECE(STR,$CHAR(10))) SET STR=$PIECE(STR,$CHAR(10),2,999) | 
|---|
| 26 | . ; | 
|---|
| 27 | . ; -- if end-of-text marker found then wrap up and quit | 
|---|
| 28 | . IF STR[EOT SET STR=$PIECE(STR,EOT) DO ADD(STR) SET DONE=1 QUIT | 
|---|
| 29 | . ; | 
|---|
| 30 | . ; -- M XML parser cannot handle an element name split across nodes | 
|---|
| 31 | . SET PIECES=$LENGTH(STR,">") | 
|---|
| 32 | . IF PIECES>1 DO ADD($PIECE(STR,">",1,PIECES-1)_">") SET STR=$PIECE(STR,">",PIECES,999) | 
|---|
| 33 | ; | 
|---|
| 34 | QUIT XOBOK | 
|---|
| 35 | ; | 
|---|
| 36 | ADD(TXT) ; -- add new intake line | 
|---|
| 37 | SET LINE=LINE+1 | 
|---|
| 38 | SET @XOBROOT@(LINE)=TXT | 
|---|
| 39 | QUIT | 
|---|
| 40 | ; | 
|---|
| 41 | CHK ; -- check if first read and change timeout and chars to read | 
|---|
| 42 | SET XOBFIRST=0 | 
|---|
| 43 | ; | 
|---|
| 44 | ; -- abort if time out occurred and nothing was read | 
|---|
| 45 | IF 'TOFLAG,$GET(XOBX)="" SET XOBSTOP=1,DONE=1,XOBOK=0 QUIT | 
|---|
| 46 | ; | 
|---|
| 47 | ; -- intercept for transport sinks | 
|---|
| 48 | IF $EXTRACT(XOBX)'="<" DO SINK | 
|---|
| 49 | ; | 
|---|
| 50 | ; -- set up for subsequent reads | 
|---|
| 51 | SET XOBREAD=200,XOBTO=1 | 
|---|
| 52 | QUIT | 
|---|
| 53 | ; | 
|---|
| 54 | ; ------------------------------------------------------------------------------------ | 
|---|
| 55 | ;                      Execute Proprietary Format Reader | 
|---|
| 56 | ; ------------------------------------------------------------------------------------ | 
|---|
| 57 | SINK ; | 
|---|
| 58 | ; -- get size of sink indicator >> then get sink indicator >> load req handler | 
|---|
| 59 | SET XOBHDLR=$$MSGSINK^XOBVRH($$GETSTR(+$$GETSTR(2,.XOBX),.XOBX),.XOBHDLR) | 
|---|
| 60 | ; | 
|---|
| 61 | ; -- execute proprietary stream reader | 
|---|
| 62 | IF $GET(XOBHDLR(XOBHDLR)) XECUTE $GET(XOBHDLR(XOBHDLR,"READER")) | 
|---|
| 63 | ; | 
|---|
| 64 | SET DONE=1 | 
|---|
| 65 | QUIT | 
|---|
| 66 | ; | 
|---|
| 67 | ; -- get string of length LEN from stream buffer | 
|---|
| 68 | GETSTR(LEN,XOBUF) ; | 
|---|
| 69 | NEW X | 
|---|
| 70 | FOR  QUIT:($LENGTH(XOBUF)'<LEN)  DO RMORE(LEN-$LENGTH(XOBUF),.XOBUF) | 
|---|
| 71 | SET X=$EXTRACT(XOBUF,1,LEN) | 
|---|
| 72 | SET XOBUF=$EXTRACT(XOBUF,LEN+1,999) | 
|---|
| 73 | QUIT X | 
|---|
| 74 | ; | 
|---|
| 75 | ; -- read more from stream buffer but only needed amount | 
|---|
| 76 | RMORE(LEN,XOBUF) ; | 
|---|
| 77 | NEW X | 
|---|
| 78 | READ X#LEN:1 SET XOBUF=XOBUF_X | 
|---|
| 79 | QUIT | 
|---|
| 80 | ; | 
|---|
| 81 | ; ------------------------------------------------------------------------------------ | 
|---|
| 82 | ;                      Methods for Openning and Closing Socket | 
|---|
| 83 | ; ------------------------------------------------------------------------------------ | 
|---|
| 84 | OPEN(XOBPARMS) ; -- Open tcp/ip socket | 
|---|
| 85 | NEW I,POP | 
|---|
| 86 | SET POP=1 | 
|---|
| 87 | ; | 
|---|
| 88 | ; -- set up os var | 
|---|
| 89 | DO OS | 
|---|
| 90 | ; | 
|---|
| 91 | ; -- preserve client io | 
|---|
| 92 | DO SAVDEV^%ZISUTL("XOB CLIENT") | 
|---|
| 93 | ; | 
|---|
| 94 | FOR I=1:1:XOBPARMS("RETRIES") DO CALL^%ZISTCP(XOBPARMS("ADDRESS"),XOBPARMS("PORT")) QUIT:'POP | 
|---|
| 95 | ; -- device open | 
|---|
| 96 | IF 'POP USE IO QUIT 1 | 
|---|
| 97 | ; -- device not open | 
|---|
| 98 | QUIT 0 | 
|---|
| 99 | ; | 
|---|
| 100 | CLOSE(XOBPARMS) ; -- close tcp/ip socket | 
|---|
| 101 | ; -- tell server to Stop() connection if close message is needed to close | 
|---|
| 102 | IF $GET(XOBPARMS("CLOSE MESSAGE"))]"" DO | 
|---|
| 103 | . DO PRE | 
|---|
| 104 | . DO WRITE($$XMLHDR^XOBVLIB()_XOBPARMS("CLOSE MESSAGE")) | 
|---|
| 105 | . DO POST | 
|---|
| 106 | ; | 
|---|
| 107 | DO FINAL | 
|---|
| 108 | DO CLOSE^%ZISTCP | 
|---|
| 109 | DO USE^%ZISUTL("XOB CLIENT") | 
|---|
| 110 | DO RMDEV^%ZISUTL("XOB CLIENT") | 
|---|
| 111 | QUIT | 
|---|
| 112 | ; | 
|---|
| 113 | INIT ; -- set up variables needed in tcp/ip processing | 
|---|
| 114 | KILL XOBNULL | 
|---|
| 115 | ; | 
|---|
| 116 | ; -- setup os var | 
|---|
| 117 | DO OS | 
|---|
| 118 | ; | 
|---|
| 119 | ; -- set RPC Broker os variable (so $$BROKER^XWBLIB returns true) | 
|---|
| 120 | SET XWBOS=XOBOS | 
|---|
| 121 | ; | 
|---|
| 122 | ; -- setup null device called "NULL" | 
|---|
| 123 | SET %ZIS="0H",IOP="NULL" DO ^%ZIS | 
|---|
| 124 | IF 'POP DO | 
|---|
| 125 | . SET XOBNULL=IO | 
|---|
| 126 | . DO SAVDEV^%ZISUTL("XOBNULL") | 
|---|
| 127 | QUIT | 
|---|
| 128 | ; | 
|---|
| 129 | OS ; -- os var | 
|---|
| 130 | SET XOBOS=$SELECT(^%ZOSF("OS")["OpenM":"OpenM",^("OS")["DSM":"DSM",^("OS")["UNIX":"UNIX",^("OS")["MSM":"MSM",1:"") | 
|---|
| 131 | QUIT | 
|---|
| 132 | ; | 
|---|
| 133 | FINAL ; -- kill variables used in tcp/ip processing | 
|---|
| 134 | ; | 
|---|
| 135 | ; -- close null device | 
|---|
| 136 | IF $DATA(XOBNULL) DO | 
|---|
| 137 | . DO USE^%ZISUTL("XOBNULL") | 
|---|
| 138 | . DO CLOSE^%ZISUTL("XOBNULL") | 
|---|
| 139 | . KILL XOBNULL | 
|---|
| 140 | ; | 
|---|
| 141 | KILL XOBOS,XWBOS | 
|---|
| 142 | ; | 
|---|
| 143 | QUIT | 
|---|
| 144 | ; | 
|---|
| 145 | ; ------------------------------------------------------------------------------------ | 
|---|
| 146 | ;                          Methods for Writing to TCP/IP Socket | 
|---|
| 147 | ; ------------------------------------------------------------------------------------ | 
|---|
| 148 | PRE ; -- prepare socket for writing | 
|---|
| 149 | SET $X=0 | 
|---|
| 150 | QUIT | 
|---|
| 151 | ; | 
|---|
| 152 | WRITE(STR) ; -- Write a data string to socket | 
|---|
| 153 | IF XOBOS="MSM" WRITE STR QUIT | 
|---|
| 154 | ; | 
|---|
| 155 | ; -- handle a short string | 
|---|
| 156 | IF $LENGTH(STR)<511 DO:($X+$LENGTH(STR))>511 FLUSH WRITE STR QUIT | 
|---|
| 157 | ; | 
|---|
| 158 | ; -- handle a long string | 
|---|
| 159 | DO FLUSH | 
|---|
| 160 | FOR  QUIT:'$LENGTH(STR)  WRITE $EXTRACT(STR,1,511) DO FLUSH SET STR=$EXTRACT(STR,512,99999) | 
|---|
| 161 | ; | 
|---|
| 162 | QUIT | 
|---|
| 163 | ; | 
|---|
| 164 | POST ; -- send eot and flush socket buffer | 
|---|
| 165 | DO WRITE($CHAR(4)) | 
|---|
| 166 | DO FLUSH | 
|---|
| 167 | QUIT | 
|---|
| 168 | ; | 
|---|
| 169 | FLUSH ; flush buffer | 
|---|
| 170 | IF XOBOS="OpenM" WRITE ! QUIT | 
|---|
| 171 | IF XOBOS="DSM" WRITE:$X>0 ! QUIT | 
|---|
| 172 | ;IF XOBOS="GTM" WRITE # QUIT | 
|---|
| 173 | QUIT | 
|---|
| 174 | ; | 
|---|