1 | XWBRW ;ISF/RWF - Read/Write for Broker TCP ;08/03/2004 15:09
|
---|
2 | ;;1.1;RPC BROKER;**35**;Mar 28, 1997
|
---|
3 | Q
|
---|
4 | ;
|
---|
5 | ;XWBRBUF is global
|
---|
6 | ;SE is a flag to skip error for short read. From PRSB+41^XWBBRK
|
---|
7 | BREAD(L,TO,SE) ;read tcp buffer, L is length, TO is timeout
|
---|
8 | N R,S,DONE,C
|
---|
9 | I L'>0 Q ""
|
---|
10 | I $L(XWBRBUF)'<L S R=$E(XWBRBUF,1,L),XWBRBUF=$E(XWBRBUF,L+1,999999) Q R
|
---|
11 | S R="",DONE=0,L=+L,C=0
|
---|
12 | S TO=$S($G(TO)>0:TO,$G(XWBTIME(1))>0:XWBTIME(1),1:60)/2+1
|
---|
13 | U XWBTDEV
|
---|
14 | F D Q:DONE
|
---|
15 | . S S=L-$L(R),R=R_$E(XWBRBUF,1,S),XWBRBUF=$E(XWBRBUF,S+1,999999)
|
---|
16 | . I ($L(R)=L)!(R[$C(4))!(C>TO) S DONE=1 Q
|
---|
17 | . R XWBRBUF:2 S:'$T C=C+1 S:$L(XWBRBUF) C=0
|
---|
18 | . I $G(XWBDEBUG)>2,$L(XWBRBUF) D LOG^XWBDLOG("rd: "_$E(XWBRBUF,1,252))
|
---|
19 | . Q
|
---|
20 | I $L(R)<L,'$G(SE) S $ECODE=",U411," ;Throw Error, Did not read full length
|
---|
21 | Q R
|
---|
22 | ;
|
---|
23 | QSND(XWBR) ;Quick send
|
---|
24 | S XWBPTYPE=1,XWBERROR="",XWBSEC="" D SND
|
---|
25 | Q
|
---|
26 | ;
|
---|
27 | ESND(XWBR) ;Send from ETRAP
|
---|
28 | S XWBPTYPE=1 D SND
|
---|
29 | Q
|
---|
30 | ;
|
---|
31 | SND ; Send a responce
|
---|
32 | N XWBSBUF S XWBSBUF=""
|
---|
33 | U XWBTDEV
|
---|
34 | ;
|
---|
35 | D SNDERR ;Send any error info
|
---|
36 | D SNDDATA ;Send the data
|
---|
37 | ;D WRITE($C(4)) ;EOT
|
---|
38 | D WRITE($C(4)),WBF
|
---|
39 | Q
|
---|
40 | ;
|
---|
41 | SNDDATA ;Send the data part
|
---|
42 | N I,D
|
---|
43 | ; -- single value
|
---|
44 | I XWBPTYPE=1 D WRITE($G(XWBR)) Q
|
---|
45 | ; -- table delimited by CR+LF
|
---|
46 | I XWBPTYPE=2 D Q
|
---|
47 | . S I="" F S I=$O(XWBR(I)) Q:I="" D WRITE(XWBR(I)),WRITE($C(13,10))
|
---|
48 | ; -- word processing
|
---|
49 | I XWBPTYPE=3 D Q
|
---|
50 | . S I="" F S I=$O(XWBR(I)) Q:I="" D WRITE(XWBR(I)) D:XWBWRAP WRITE($C(13,10))
|
---|
51 | ; -- global array
|
---|
52 | I XWBPTYPE=4 D Q
|
---|
53 | . I $E($G(XWBR))'="^" Q
|
---|
54 | . S I=$G(XWBR) Q:I="" S T=$E(I,1,$L(I)-1)
|
---|
55 | . ;Only send root node if non-null.
|
---|
56 | . I $D(@I)>10 S D=@I I $L(D) D WRITE(D),WRITE($C(13,10)):XWBWRAP&(D'=$C(13,10))
|
---|
57 | . F S I=$Q(@I) Q:I=""!(I'[T) S D=@I D WRITE(D),WRITE($C(13,10)):XWBWRAP&(D'=$C(13,10))
|
---|
58 | . I $D(@XWBR) K @XWBR
|
---|
59 | ; -- global instance
|
---|
60 | I XWBPTYPE=5 D Q
|
---|
61 | . I $E($G(XWBR))'="^" Q
|
---|
62 | . S XWBR=$G(@XWBR) D WRITE(XWBR) Q
|
---|
63 | ; -- variable length records only good upto 255 char)
|
---|
64 | I XWBPTYPE=6 D
|
---|
65 | . S I="" F S I=$O(XWBR(I)) Q:I="" D WRITE($C($L(XWBR(I)))),WRITE(XWBR(I))
|
---|
66 | Q
|
---|
67 | ;
|
---|
68 | SNDERR ;send error information
|
---|
69 | ;XWBSEC is the security packet, XWBERROR is application packet
|
---|
70 | N X
|
---|
71 | S $X=0 ;Start with zero
|
---|
72 | S X=$E($G(XWBSEC),1,255)
|
---|
73 | D WRITE($C($L(X))_X)
|
---|
74 | S X=$E($G(XWBERROR),1,255)
|
---|
75 | D WRITE($C($L(X))_X)
|
---|
76 | S XWBERROR="",XWBSEC="" ;clears parameters
|
---|
77 | Q
|
---|
78 | ;
|
---|
79 | WRITE(STR) ;Write a data string
|
---|
80 | ; send data for DSM (requires buffer flush (!) every 511 chars)
|
---|
81 | ;IF XWBOS="DSM"!(XWBOS="UNIX")!(XWBOS="OpenM) next line
|
---|
82 | F Q:'$L(STR) D
|
---|
83 | . I $L(XWBSBUF)+$L(STR)>240 D WBF
|
---|
84 | . S XWBSBUF=XWBSBUF_$E(STR,1,255),STR=$E(STR,256,99999)
|
---|
85 | Q
|
---|
86 | WBF ;Write Buffer Flush
|
---|
87 | Q:'$L(XWBSBUF)
|
---|
88 | I $G(XWBDEBUG)>2,$L(XWBSBUF) D LOG^XWBDLOG("wrt ("_$L(XWBSBUF)_"): "_$E(XWBSBUF,1,247))
|
---|
89 | W XWBSBUF,@XWBT("BF")
|
---|
90 | S XWBSBUF=""
|
---|
91 | Q
|
---|