1
/* $Xorg: imTransR.c,v 1.4 2000/08/17 19:45:16 cpqbld Exp $ */
2
/******************************************************************
4
Copyright 1992 by Sun Microsystems, Inc.
5
Copyright 1992, 1993, 1994 by FUJITSU LIMITED
7
Permission to use, copy, modify, distribute, and sell this software
8
and its documentation for any purpose is hereby granted without fee,
9
provided that the above copyright notice appear in all copies and
10
that both that copyright notice and this permission notice appear
11
in supporting documentation, and that the name of Sun Microsystems, Inc.
12
and FUJITSU LIMITED not be used in advertising or publicity pertaining to
13
distribution of the software without specific, written prior permission.
14
Sun Microsystems, Inc. and FUJITSU LIMITED makes no representations about
15
the suitability of this software for any purpose.
16
It is provided "as is" without express or implied warranty.
18
Sun Microsystems Inc. AND FUJITSU LIMITED DISCLAIMS ALL WARRANTIES WITH
19
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
20
AND FITNESS, IN NO EVENT SHALL Sun Microsystems, Inc. AND FUJITSU LIMITED
21
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
24
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26
Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
27
Takashi Fujiwara FUJITSU LIMITED
28
fujiwara@a80.tech.yk.fujitsu.co.jp
30
******************************************************************/
31
/* $XFree86: xc/lib/X11/imTransR.c,v 3.4 2001/01/17 19:41:52 dawes Exp $ */
38
Public TransportSW _XimTransportRec[] = {
39
{ "X", _XimXConf }, /* 1st entry must be X.
40
This will be a fallback */
42
{ "tcp", _XimTransConf }, /* use X transport lib */
44
#if defined(UNIXCONN) || defined(LOCALCONN)
45
{ "local", _XimTransConf }, /* use X transport lib */
48
{ "dnet", _XimTransConf }, /* use X transport lib */
51
{ "streams", _XimTransConf }, /* use X transport lib */
52
#endif /* STREAMSCONN */
53
{ (char *)NULL, (Bool (*)())NULL },
60
return im->private.proto.connect(im);
67
return im->private.proto.shutdown(im);
71
#if NeedFunctionPrototypes
72
_XimWrite(Xim im, INT16 len, XPointer data)
74
_XimWrite(im, len, data)
80
return im->private.proto.write(im, len, data);
84
_CheckProtocolData(im, recv_buf)
90
data_len = (int)(((*((CARD16 *)recv_buf + 1)) * 4) + XIM_HEADER_SIZE);
95
_XimReadData(im, len, buf, buf_size)
108
if (buf_size < XIM_HEADER_SIZE) {
109
*len = (INT16)XIM_HEADER_SIZE;
113
bzero(buf, buf_size);
117
if ((hold_buf = im->private.proto.hold_data)) {
118
data_len = im->private.proto.hold_data_len;
119
if (data_len >= XIM_HEADER_SIZE) {
120
packet_size = _CheckProtocolData(im, hold_buf);
121
if (packet_size > buf_size) {
122
*len = (INT16)packet_size;
125
if (packet_size <= data_len) {
126
memcpy(buf, hold_buf, packet_size);
127
for (i = packet_size; i < data_len; i++) {
134
if (!(tmp = (char *)Xmalloc(data_len))) {
137
memcpy(tmp, &hold_buf[i], data_len);
138
im->private.proto.hold_data = tmp;
139
im->private.proto.hold_data_len = data_len;
141
im->private.proto.hold_data = 0;
142
im->private.proto.hold_data_len = 0;
145
*len = (INT16)packet_size;
149
memcpy(buf, hold_buf, data_len);
150
buf_size -= data_len;
152
im->private.proto.hold_data = 0;
153
im->private.proto.hold_data_len = 0;
157
while (data_len < XIM_HEADER_SIZE) {
158
if (!(im->private.proto.read(im,
159
(XPointer)&buf[data_len], buf_size, &ret_len))) {
165
packet_size = _CheckProtocolData(im, buf);
168
if (packet_size > buf_size) {
169
if (!(tmp = (char *)Xmalloc(data_len))) {
172
memcpy(tmp, buf, data_len);
173
bzero(buf, data_len);
174
im->private.proto.hold_data = tmp;
175
im->private.proto.hold_data_len = data_len;
176
*len = (INT16)packet_size;
180
while (data_len < packet_size) {
181
if (!(im->private.proto.read(im,
182
(XPointer)&buf[data_len], buf_size, &ret_len))) {
189
for (i = packet_size; i < data_len; i++) {
196
if (!(tmp = (char *)Xmalloc(data_len))) {
199
memcpy(tmp, &buf[i], data_len);
200
bzero(&buf[i], data_len);
201
im->private.proto.hold_data = tmp;
202
im->private.proto.hold_data_len = data_len;
204
im->private.proto.hold_data = 0;
205
im->private.proto.hold_data_len = 0;
207
*len = (INT16)packet_size;
212
_XimCallDispatcher(im, len, data)
217
return im->private.proto.call_dispatcher(im, len, data);
221
_XimRead(im, len, buf, buf_size, predicate, arg)
227
#if NeedNestedPrototypes
228
Xim, INT16, XPointer, XPointer
237
ret_code = _XimReadData(im, &read_len, buf, buf_size);
238
if(ret_code != XIM_TRUE) {
241
if ((*predicate)(im, read_len, buf, arg))
243
if (_XimCallDispatcher(im, read_len, buf))
245
_XimError(im, 0, XIM_BadProtocol, (INT16)0, (CARD16)0, (char *)NULL);
252
_XimRegisterDispatcher(im, callback, call_data)
255
#if NeedNestedPrototypes
256
Xim, INT16, XPointer, XPointer
261
return im->private.proto.register_dispatcher(im, callback, call_data);
268
im->private.proto.flush(im);
273
_XimFilterWaitEvent(im)
277
CARD32 reply32[BUFSIZE/4];
278
char *reply = (char *)reply32;
284
ret_code = _XimReadData(im, &read_len, (XPointer)reply, buf_size);
285
if(ret_code == XIM_TRUE) {
287
} else if(ret_code == XIM_OVERFLOW) {
291
buf_size = (int)read_len;
292
preply = (XPointer)Xmalloc(buf_size);
293
ret_code = _XimReadData(im, &read_len, preply, buf_size);
294
if(ret_code != XIM_TRUE) {
303
if (_XimCallDispatcher(im, read_len, preply)) {
308
_XimError(im, 0, XIM_BadProtocol, (INT16)0, (CARD16)0, (char *)NULL);