diff options
Diffstat (limited to 'nx-X11/lib/X11/XlibAsync.c')
-rw-r--r-- | nx-X11/lib/X11/XlibAsync.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/nx-X11/lib/X11/XlibAsync.c b/nx-X11/lib/X11/XlibAsync.c new file mode 100644 index 000000000..cf1bd83fe --- /dev/null +++ b/nx-X11/lib/X11/XlibAsync.c @@ -0,0 +1,181 @@ +/* $Xorg: XlibAsync.c,v 1.4 2001/02/09 02:03:38 xorgcvs Exp $ */ +/* + +Copyright 1992, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/**************************************************************************/ +/* */ +/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */ +/* */ +/* NX-X11, NX protocol compression and NX extensions to this software */ +/* are copyright of NoMachine. Redistribution and use of the present */ +/* software is allowed according to terms specified in the file LICENSE */ +/* which comes in the source distribution. */ +/* */ +/* Check http://www.nomachine.com/licensing.html for applicability. */ +/* */ +/* NX and NoMachine are trademarks of NoMachine S.r.l. */ +/* */ +/* All rights reserved. */ +/* */ +/**************************************************************************/ + +#define NEED_REPLIES +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <X11/Xlibint.h> +#include <X11/Xos.h> + +/*ARGSUSED*/ +Bool +_XAsyncErrorHandler(dpy, rep, buf, len, data) + register Display *dpy; + register xReply *rep; + char *buf; + int len; + XPointer data; +{ + register _XAsyncErrorState *state; + + state = (_XAsyncErrorState *)data; + if (rep->generic.type == X_Error && + (!state->error_code || + rep->error.errorCode == state->error_code) && + (!state->major_opcode || + rep->error.majorCode == state->major_opcode) && + (!state->minor_opcode || + rep->error.minorCode == state->minor_opcode) && + (!state->min_sequence_number || + (state->min_sequence_number <= dpy->last_request_read)) && + (!state->max_sequence_number || + (state->max_sequence_number >= dpy->last_request_read))) { + state->last_error_received = rep->error.errorCode; + state->error_count++; + return True; + } + return False; +} + +void _XDeqAsyncHandler(dpy, handler) + Display *dpy; + register _XAsyncHandler *handler; +{ + register _XAsyncHandler **prev; + register _XAsyncHandler *async; + + for (prev = &dpy->async_handlers; + (async = *prev) && (async != handler); + prev = &async->next) + ; + if (async) + *prev = async->next; +} + +char * +_XGetAsyncReply(dpy, replbuf, rep, buf, len, extra, discard) + register Display *dpy; + register char *replbuf; /* data is read into this buffer */ + register xReply *rep; /* value passed to calling handler */ + char *buf; /* value passed to calling handler */ + int len; /* value passed to calling handler */ + int extra; /* extra words to read, ala _XReply */ + Bool discard; /* discard after extra?, ala _XReply */ +{ + if (extra == 0) { + if (discard && (rep->generic.length << 2) > len) + _XEatData (dpy, (rep->generic.length << 2) - len); + return (char *)rep; + } + + if (extra <= rep->generic.length) { + int size = SIZEOF(xReply) + (extra << 2); + if (size > len) { + memcpy(replbuf, buf, len); + _XRead(dpy, replbuf + len, size - len); + buf = replbuf; + len = size; +#ifdef MUSTCOPY + } else { + memcpy(replbuf, buf, size); + buf = replbuf; +#endif + } + + if (discard && rep->generic.length > extra && + (rep->generic.length << 2) > len) + _XEatData (dpy, (rep->generic.length << 2) - len); + + return buf; + } + /* + *if we get here, then extra > rep->generic.length--meaning we + * read a reply that's shorter than we expected. This is an + * error, but we still need to figure out how to handle it... + */ + if ((rep->generic.length << 2) > len) + _XEatData (dpy, (rep->generic.length << 2) - len); +#ifdef NX_TRANS_SOCKET + + /* + * The original code has provision + * for returning already. + */ + +#endif + _XIOError (dpy); + return (char *)rep; +} + +void +_XGetAsyncData(dpy, data, buf, len, skip, datalen, discardtotal) + Display *dpy; + char *data; /* data is read into this buffer */ + char *buf; /* value passed to calling handler */ + int len; /* value passed to calling handler */ + int skip; /* number of bytes already read in previous + _XGetAsyncReply or _XGetAsyncData calls */ + int datalen; /* size of data buffer in bytes */ + int discardtotal; /* min. bytes to consume (after skip) */ +{ + buf += skip; + len -= skip; + if (!data) { + if (datalen > len) + _XEatData(dpy, datalen - len); + } else if (datalen <= len) { + memcpy(data, buf, datalen); + } else { + memcpy(data, buf, len); + _XRead(dpy, data + len, datalen - len); + } + if (discardtotal > len) { + if (datalen > len) + len = datalen; + _XEatData(dpy, discardtotal - len); + } +} |