/* $Xorg: lbxopts.h,v 1.3 2000/08/18 04:05:45 coskrey Exp $ */
/*
 * Copyright 1994 Network Computing Devices, Inc.
 *
 * 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, and that the name Network Computing Devices, Inc. not be
 * used in advertising or publicity pertaining to distribution of this
 * software without specific, written prior permission.
 *
 * THIS SOFTWARE IS PROVIDED `AS-IS'.  NETWORK COMPUTING DEVICES, INC.,
 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT
 * LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NONINFRINGEMENT.  IN NO EVENT SHALL NETWORK
 * COMPUTING DEVICES, INC., BE LIABLE FOR ANY DAMAGES WHATSOEVER, INCLUDING
 * SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS OF USE, DATA,
 * OR PROFITS, EVEN IF ADVISED OF THE POSSIBILITY THEREOF, AND REGARDLESS OF
 * WHETHER IN AN ACTION IN CONTRACT, TORT OR NEGLIGENCE, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */
/* $XFree86: xc/include/extensions/lbxopts.h,v 1.5 2001/01/17 17:53:21 dawes Exp $ */

#ifndef _LBX_OPTS_H_
#define _LBX_OPTS_H_

/*
 * Negotiable configuration options
 */
#define LBX_OPT_DELTA_PROXY		0
#define LBX_OPT_DELTA_SERVER		1
#define LBX_OPT_STREAM_COMP		2
#define LBX_OPT_BITMAP_COMP		3
#define LBX_OPT_PIXMAP_COMP		4
#define LBX_OPT_MSG_COMP		5	/* aka "squishing" */
#define LBX_OPT_USE_TAGS		6
#define LBX_OPT_CMAP_ALL		7
#define LBX_OPT_EXTENSION		255

/*
 * Length fields are encoded in 1 or 3 bytes
 */
#define LBX_OPT_SMALLLEN_SIZE		1
#define LBX_OPT_BIGLEN_SIZE		3
#define LBX_OPT_BIGLEN_MIN		256

#define LBX_OPT_DECODE_LEN(p, len, size) \
    if ((p)[0]) { \
	(len) = (p)[0]; \
	(size) = LBX_OPT_SMALLLEN_SIZE; \
    } \
    else { \
	(len) = ((LBX_OPT_BIGLEN_MIN + (p)[1]) << 8) | (p)[2]; \
	(size) = LBX_OPT_BIGLEN_SIZE; \
    }

/*
 * Option header lengths
 */
#define LBX_OPT_SMALLHDR_LEN		(1 + LBX_OPT_SMALLLEN_SIZE)
#define LBX_OPT_BIGHDR_LEN		(1 + LBX_OPT_BIGLEN_SIZE)

/*
 * Delta compression parameters
 */
#define LBX_OPT_DELTA_REQLEN		6
#define LBX_OPT_DELTA_REPLYLEN		2
#define LBX_OPT_DELTA_NCACHE_DFLT	16
#define LBX_OPT_DELTA_MSGLEN_MIN	32
#define LBX_OPT_DELTA_MSGLEN_DFLT	64


/*
 * Stream compression opts
 */

#include <sys/types.h>

#if defined(WIN32) || (defined(USG) && !defined(CRAY) && !defined(umips) && !defined(MOTOROLA) && !defined(uniosu) && !defined(__sxg__))

struct iovec {
    caddr_t iov_base;
    int iov_len;
};

#else
#ifndef Lynx
#include <sys/uio.h>
#else
#include <uio.h>
#endif
#endif

typedef void *LbxStreamCompHandle;

typedef struct _LbxStreamOpts {
    LbxStreamCompHandle	(*streamCompInit)(int fd, pointer arg);
    pointer		streamCompArg;
    int			(*streamCompStuffInput)(
			    int fd,
			    unsigned char *buf,
			    int buflen
			);
    int			(*streamCompInputAvail)(
			    int fd
			);
    int			(*streamCompFlush)(
			    int fd
			);
    int			(*streamCompRead)(
			    int fd,
			    unsigned char *buf,
			    int buflen
			);
    int         	(*streamCompWriteV)(
			    int fd,
			    struct iovec *iov,
			    int iovcnt
			);
    void		(*streamCompOn)(
			    int fd
			);
    void		(*streamCompOff)(
			    int fd
			);
    void		(*streamCompFreeHandle)(
			    LbxStreamCompHandle handle
			);
} LbxStreamOpts;

#endif /* _LBX_OPTS_H_ */
