| [613] | 1 | XWBRW ;ISF/RWF - Read/Write for Broker TCP ;8/16/07  09:33 | 
|---|
|  | 2 | ;;1.1;RPC BROKER;**35,49**;Mar 28, 1997;Build 4;WorldVistA 30-Jan-08 | 
|---|
|  | 3 | ;Modified from FOIA VISTA, | 
|---|
|  | 4 | ;Copyright 2008 WorldVistA.  Licensed under the terms of the GNU | 
|---|
|  | 5 | ;General Public License See attached copy of the License. | 
|---|
|  | 6 | ; | 
|---|
|  | 7 | ;This program is free software; you can redistribute it and/or modify | 
|---|
|  | 8 | ;it under the terms of the GNU General Public License as published by | 
|---|
|  | 9 | ;the Free Software Foundation; either version 2 of the License, or | 
|---|
|  | 10 | ;(at your option) any later version. | 
|---|
|  | 11 | ; | 
|---|
|  | 12 | ;This program is distributed in the hope that it will be useful, | 
|---|
|  | 13 | ;but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
|  | 14 | ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
|  | 15 | ;GNU General Public License for more details. | 
|---|
|  | 16 | ; | 
|---|
|  | 17 | ;You should have received a copy of the GNU General Public License along | 
|---|
|  | 18 | ;with this program; if not, write to the Free Software Foundation, Inc., | 
|---|
|  | 19 | ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 
|---|
|  | 20 | Q | 
|---|
|  | 21 | ; | 
|---|
|  | 22 | ;XWBRBUF is global | 
|---|
|  | 23 | ;SE is a flag to skip error for short read. From PRSB+41^XWBBRK | 
|---|
|  | 24 | BREAD(L,TO,SE) ;read tcp buffer, L is length, TO is timeout | 
|---|
|  | 25 | N R,S,DONE,C | 
|---|
|  | 26 | I L'>0 Q "" | 
|---|
|  | 27 | I $L(XWBRBUF)'<L S R=$E(XWBRBUF,1,L),XWBRBUF=$E(XWBRBUF,L+1,999999) Q R | 
|---|
|  | 28 | S R="",DONE=0,L=+L,C=0 | 
|---|
|  | 29 | S TO=$S($G(TO)>0:TO,$G(XWBTIME(1))>0:XWBTIME(1),1:60)/2+1 | 
|---|
|  | 30 | U XWBTDEV | 
|---|
|  | 31 | F  D  Q:DONE | 
|---|
|  | 32 | . S S=L-$L(R),R=R_$E(XWBRBUF,1,S),XWBRBUF=$E(XWBRBUF,S+1,999999) | 
|---|
|  | 33 | . I ($L(R)=L)!(R[$C(4))!(C>TO) S DONE=1 Q | 
|---|
|  | 34 | . R XWBRBUF#S:2 S:'$T C=C+1 S:$L(XWBRBUF) C=0 I +$DEVICE S DONE=1 | 
|---|
|  | 35 | . I $G(XWBDEBUG)>2,$L(XWBRBUF) D LOG^XWBDLOG("rd: "_$E(XWBRBUF,1,252)) | 
|---|
|  | 36 | . Q | 
|---|
|  | 37 | I $L(R)<L,'$G(SE) S $ECODE=",U411," ;Throw Error, Did not read full length | 
|---|
|  | 38 | Q R | 
|---|
|  | 39 | ; | 
|---|
|  | 40 | QSND(XWBR) ;Quick send | 
|---|
|  | 41 | S XWBPTYPE=1,XWBERROR="",XWBSEC="" D SND | 
|---|
|  | 42 | Q | 
|---|
|  | 43 | ; | 
|---|
|  | 44 | ESND(XWBR) ;Send from ETRAP | 
|---|
|  | 45 | S XWBPTYPE=1 D SND | 
|---|
|  | 46 | Q | 
|---|
|  | 47 | ; | 
|---|
|  | 48 | SND ; Send a responce | 
|---|
|  | 49 | N XWBSBUF S XWBSBUF="" | 
|---|
|  | 50 | U XWBTDEV | 
|---|
|  | 51 | ; | 
|---|
|  | 52 | D SNDERR ;Send any error info | 
|---|
|  | 53 | D SNDDATA ;Send the data | 
|---|
|  | 54 | ;D WRITE($C(4)) ;EOT | 
|---|
|  | 55 | D WRITE($C(4)),WBF | 
|---|
|  | 56 | Q | 
|---|
|  | 57 | ; | 
|---|
|  | 58 | SNDDATA ;Send the data part | 
|---|
|  | 59 | N I,D | 
|---|
|  | 60 | ; -- single value | 
|---|
|  | 61 | I XWBPTYPE=1 D WRITE($G(XWBR)) Q | 
|---|
|  | 62 | ; -- table delimited by CR+LF | 
|---|
|  | 63 | I XWBPTYPE=2 D  Q | 
|---|
|  | 64 | . S I="" F  S I=$O(XWBR(I)) Q:I=""  D WRITE(XWBR(I)),WRITE($C(13,10)) | 
|---|
|  | 65 | ; -- word processing | 
|---|
|  | 66 | I XWBPTYPE=3 D  Q | 
|---|
|  | 67 | . S I="" F  S I=$O(XWBR(I)) Q:I=""  D WRITE(XWBR(I)) D:XWBWRAP WRITE($C(13,10)) | 
|---|
|  | 68 | ; -- global array | 
|---|
|  | 69 | I XWBPTYPE=4 D  Q | 
|---|
|  | 70 | . I $E($G(XWBR))'="^" Q | 
|---|
|  | 71 | . S I=$G(XWBR) Q:I=""  S T=$E(I,1,$L(I)-1) | 
|---|
|  | 72 | . ;Only send root node if non-null. | 
|---|
|  | 73 | . I $D(@I)>10 S D=@I I $L(D) D WRITE(D),WRITE($C(13,10)):XWBWRAP&(D'=$C(13,10)) | 
|---|
|  | 74 | . F  S I=$Q(@I) Q:I=""!(I'[T)  S D=@I D WRITE(D),WRITE($C(13,10)):XWBWRAP&(D'=$C(13,10)) | 
|---|
|  | 75 | . I $D(@XWBR) K @XWBR | 
|---|
|  | 76 | ; -- global instance | 
|---|
|  | 77 | I XWBPTYPE=5 D  Q | 
|---|
|  | 78 | . I $E($G(XWBR))'="^" Q | 
|---|
|  | 79 | . S XWBR=$G(@XWBR) D WRITE(XWBR) Q | 
|---|
|  | 80 | ; -- variable length records only good upto 255 char) | 
|---|
|  | 81 | I XWBPTYPE=6 D | 
|---|
|  | 82 | . S I="" F  S I=$O(XWBR(I)) Q:I=""  D WRITE($C($L(XWBR(I)))),WRITE(XWBR(I)) | 
|---|
|  | 83 | Q | 
|---|
|  | 84 | ; | 
|---|
|  | 85 | SNDERR ;send error information | 
|---|
|  | 86 | ;XWBSEC is the security packet, XWBERROR is application packet | 
|---|
|  | 87 | N X | 
|---|
|  | 88 | S $X=0 ;Start with zero | 
|---|
|  | 89 | S X=$E($G(XWBSEC),1,255) | 
|---|
|  | 90 | D WRITE($C($L(X))_X) | 
|---|
|  | 91 | S X=$E($G(XWBERROR),1,255) | 
|---|
|  | 92 | D WRITE($C($L(X))_X) | 
|---|
|  | 93 | S XWBERROR="",XWBSEC="" ;clears parameters | 
|---|
|  | 94 | Q | 
|---|
|  | 95 | ; | 
|---|
|  | 96 | WRITE(STR) ;Write a data string | 
|---|
|  | 97 | ; send data for DSM (requires buffer flush (!) every 511 chars) | 
|---|
|  | 98 | ;IF XWBOS="DSM"!(XWBOS="UNIX")!(XWBOS="OpenM) next line | 
|---|
|  | 99 | F  Q:'$L(STR)  D | 
|---|
|  | 100 | . I $L(XWBSBUF)+$L(STR)>240 D WBF | 
|---|
|  | 101 | . S XWBSBUF=XWBSBUF_$E(STR,1,255),STR=$E(STR,256,99999) | 
|---|
|  | 102 | Q | 
|---|
|  | 103 | WBF ;Write Buffer Flush | 
|---|
|  | 104 | Q:'$L(XWBSBUF) | 
|---|
|  | 105 | I $G(XWBDEBUG)>2,$L(XWBSBUF) D LOG^XWBDLOG("wrt ("_$L(XWBSBUF)_"): "_$E(XWBSBUF,1,247)) | 
|---|
|  | 106 | W XWBSBUF,@XWBT("BF") | 
|---|
|  | 107 | S XWBSBUF="" | 
|---|
|  | 108 | Q | 
|---|