/************************************************************
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
and the Massachusetts Institute of Technology, Cambridge, Massachusetts.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its 
documentation for any purpose and without fee is hereby granted, 
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 names of Digital or MIT not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.  

DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.

********************************************************/

/* $Header: swapreq.c,v 1.18 87/06/11 23:10:16 sue Exp $ */

#include "X.h"
#define NEED←REPLIES
#define NEED←EVENTS
#include "Xproto.h"
#include "Xprotostr.h"
#include "windowstr.h"
#include "font.h"
#include "gc.h"
#include "os.h"
#include "resource.h"
#include "selection.h"
#include "colormap.h"
#include "dixstruct.h"
#include "extension.h"
#include "input.h"
#include "cursor.h"

extern WindowRec WindowTable[];
extern xConnSetupPrefix connSetupPrefix;
extern char *ConnectionInfo;
extern char *SwappedConnInfo;
extern int (* ProcVector[256]) ();

/* Thanks to Jack Palevich for testing and subsequently rewriting all this */

#define LengthRestB(stuff) \
    ((stuff->length << 2) - sizeof(*stuff))

#define LengthRestS(stuff) \
    ((stuff->length << 1)  - (sizeof(*stuff) >> 1))

#define LengthRestL(stuff) \
    (stuff->length  - (sizeof(*stuff) >> 2))

#define SwapRestS(stuff) \
    SwapShorts((short *)(stuff + 1), (int)LengthRestS(stuff))

#define SwapRestL(stuff) \
    SwapLongs((long *)(stuff + 1), (int)LengthRestL(stuff))


int
SProcCopyPlane(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xCopyPlaneReq);
    swaps(&stuff->length, n);
    swapl(&stuff->srcDrawable, n);
    swapl(&stuff->dstDrawable, n);
    swapl(&stuff->gc, n);
    swaps(&stuff->srcX, n);
    swaps(&stuff->srcY, n);
    swaps(&stuff->dstX, n);
    swaps(&stuff->dstY, n);
    swaps(&stuff->width, n);
    swaps(&stuff->height, n);
    swapl(&stuff->bitPlane, n);
    return((* ProcVector[X←CopyPlane])(client));
}

int
SProcPolyPoint(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xPolyPointReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    SwapRestS(stuff);
    return((* ProcVector[X←PolyPoint])(client));
}

int
SProcPolyLine(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xPolyLineReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    SwapRestS(stuff);
    return((* ProcVector[X←PolyLine])(client));
}

int
SProcPolySegment(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xPolySegmentReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    SwapRestS(stuff);
    return((* ProcVector[X←PolySegment])(client));
}

int
SProcPolyRectangle (client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xPolyRectangleReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    SwapRestS(stuff);
    return((* ProcVector[X←PolyRectangle])(client));
}

int
SProcPolyArc(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xPolyArcReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    SwapRestS(stuff);
    return((* ProcVector[X←PolyArc])(client));
}

int
SProcFillPoly(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xFillPolyReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    SwapRestS(stuff);
    return((* ProcVector[X←FillPoly])(client));

}

int
SProcPolyFillRectangle(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xPolyFillRectangleReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    SwapRestS(stuff);
    return((* ProcVector[X←PolyFillRectangle])(client));
}

int
SProcPolyFillArc               (client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xPolyFillArcReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    SwapRestS(stuff);
    return((* ProcVector[X←PolySegment])(client));
}

int
SProcPutImage(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xPutImageReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    swaps(&stuff->width, n);
    swaps(&stuff->height, n);
    swaps(&stuff->dstX, n);
    swaps(&stuff->dstY, n);
    /* Image should already be swapped */
    return((* ProcVector[X←PutImage])(client));

}

int
SProcGetImage(client)
    register ClientPtr	client;
{
    register int n;
    REQUEST(xGetImageReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swaps(&stuff->x, n);
    swaps(&stuff->y, n);
    swaps(&stuff->width, n);
    swaps(&stuff->height, n);
    return((* ProcVector[X←GetImage])(client));
}

int
SProcPolyText(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xPolyTextReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    swaps(&stuff->x, n);
    swaps(&stuff->y, n);
    /* We don't swap the TextElt list here because it's simpler to do it as
     * a special case in ProcPolyText.
     */
    return((* ProcVector[X←PolyText8])(client));
}

int
SProcImageText(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xImageTextReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swapl(&stuff->gc, n);
    swaps(&stuff->x, n);
    swaps(&stuff->y, n);
    /* Check if we're ImageText8 or ImageText16 */
    switch(stuff->reqType)
    {
	case X←ImageText8:
            return((* ProcVector[X←ImageText8])(client));
	case X←ImageText16:
	    SwapRestS(stuff);
            return((* ProcVector[X←ImageText16])(client));
    }
    return BadValue;
}

int
SProcCreateColormap(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xCreateColormapReq);
    swaps(&stuff->length, n);
    swapl(&stuff->mid, n);
    swapl(&stuff->window, n);
    swapl(&stuff->visual, n);
    return((* ProcVector[X←CreateColormap])(client));
}

int
SProcFreeColormap(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xResourceReq);
    swaps(&stuff->length, n);
    swapl(&stuff->id, n);
    return((* ProcVector[X←FreeColormap])(client));
}


int
SProcCopyColormapAndFree(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xCopyColormapAndFreeReq);
    swaps(&stuff->length, n);
    swapl(&stuff->mid, n);
    swapl(&stuff->srcCmap, n);
    return((* ProcVector[X←CopyColormapAndFree])(client));

}

int
SProcInstallColormap(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xResourceReq);
    swaps(&stuff->length, n);
    swapl(&stuff->id, n);
    return((* ProcVector[X←InstallColormap])(client));

}

int
SProcUninstallColormap(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xResourceReq);
    swaps(&stuff->length, n);
    swapl(&stuff->id, n);
    return((* ProcVector[X←UninstallColormap])(client));
}

int
SProcListInstalledColormaps(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xResourceReq);
    swaps(&stuff->length, n);
    swapl(&stuff->id, n);
    return((* ProcVector[X←ListInstalledColormaps])(client));
}

int
SProcAllocColor                (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xAllocColorReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    swaps(&stuff->red, n);
    swaps(&stuff->green, n);
    swaps(&stuff->blue, n);
    return((* ProcVector[X←AllocColor])(client));
}

int
SProcAllocNamedColor           (client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xAllocNamedColorReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    swaps(&stuff->nbytes, n);
    return((* ProcVector[X←AllocNamedColor])(client));
}

int
SProcAllocColorCells           (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xAllocColorCellsReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    swaps(&stuff->colors, n);
    swaps(&stuff->planes, n);
    return((* ProcVector[X←AllocColorCells])(client));
}

int
SProcAllocColorPlanes(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xAllocColorPlanesReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    swaps(&stuff->colors, n);
    swaps(&stuff->red, n);
    swaps(&stuff->green, n);
    swaps(&stuff->blue, n);
    return((* ProcVector[X←AllocColorPlanes])(client));
}

int
SProcFreeColors          (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xFreeColorsReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    swapl(&stuff->planeMask, n);
    SwapRestL(stuff);
    return((* ProcVector[X←FreeColors])(client));

}

int
SProcStoreColors               (client)
    register ClientPtr client;
{
    register int n;
    xColorItem 	*pItem;

    REQUEST(xStoreColorsReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    pItem = (xColorItem *) &stuff[1];
    for(n = 0; n < LengthRestB(stuff)/sizeof(xColorItem); n++)
	SwapColorItem(pItem++);
    return((* ProcVector[X←StoreColors])(client));
}

int
SProcStoreNamedColor           (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xStoreNamedColorReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    swapl(&stuff->pixel, n);
    swaps(&stuff->nbytes, n);
    return((* ProcVector[X←StoreNamedColor])(client));
}

int
SProcQueryColors(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xQueryColorsReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    SwapRestL(stuff);
    return((* ProcVector[X←QueryColors])(client));
} 

int
SProcLookupColor(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xLookupColorReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cmap, n);
    swaps(&stuff->nbytes, n);
    return((* ProcVector[X←GetWindowAttributes])(client));
}

int
SProcCreateCursor( client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xCreateCursorReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cid, n);
    swapl(&stuff->source, n);
    swapl(&stuff->mask, n);
    swaps(&stuff->foreRed, n);
    swaps(&stuff->foreGreen, n);
    swaps(&stuff->foreBlue, n);
    swaps(&stuff->backRed, n);
    swaps(&stuff->backGreen, n);
    swaps(&stuff->backBlue, n);
    swaps(&stuff->x, n);
    swaps(&stuff->y, n);
    return((* ProcVector[X←CreateCursor])(client));
}

int
SProcCreateGlyphCursor( client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xCreateGlyphCursorReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cid, n);
    swapl(&stuff->source, n);
    swapl(&stuff->mask, n);
    swaps(&stuff->sourceChar, n);
    swaps(&stuff->maskChar, n);
    swaps(&stuff->foreRed, n);
    swaps(&stuff->foreGreen, n);
    swaps(&stuff->foreBlue, n);
    swaps(&stuff->backRed, n);
    swaps(&stuff->backGreen, n);
    swaps(&stuff->backBlue, n);
    return((* ProcVector[X←CreateGlyphCursor])(client));
}


int
SProcRecolorCursor(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xRecolorCursorReq);
    swaps(&stuff->length, n);
    swapl(&stuff->cursor, n);
    swaps(&stuff->foreRed, n);
    swaps(&stuff->foreGreen, n);
    swaps(&stuff->foreBlue, n);
    swaps(&stuff->foreRed, n);
    swaps(&stuff->foreGreen, n);
    swaps(&stuff->backBlue, n);
    return((* ProcVector[X←RecolorCursor])(client));
}

int
SProcFreeCursor(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xResourceReq);
    swaps(&stuff->length, n);
    swapl(&stuff->id, n);
    return((* ProcVector[X←FreeCursor])(client));

}

int
SProcQueryBestSize   (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xQueryBestSizeReq);
    swaps(&stuff->length, n);
    swapl(&stuff->drawable, n);
    swaps(&stuff->width, n);
    swaps(&stuff->height, n);
    return((* ProcVector[X←QueryBestSize])(client));

}

int
SProcListExtensions(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←ListExtensions])(client));

}

int
SProcQueryExtension   (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xQueryExtensionReq);
    swaps(&stuff->length, n);
    swapl(&stuff->nbytes, n);
    return((* ProcVector[X←QueryExtension])(client));
}

int
SProcChangeKeyboardMapping   (client)
    register ClientPtr client;
{
    register int n;
    register long *p;
    register int i, count;

    REQUEST(xChangeKeyboardMappingReq);
    swaps(&stuff->length, n);
    p = (long *)&stuff[1];
    count = stuff->keyCodes * stuff->keySymsPerKeyCode;
    for(i = 0; i < count; i++)
    {
        swapl(p, n);
	p++;
    }
    return((* ProcVector[X←ChangeKeyboardMapping])(client));
}

int
SProcSetPointerMapping   (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xSetPointerMappingReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←SetPointerMapping])(client));
}

int
SProcGetKeyboardMapping(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←GetKeyboardMapping])(client));
}

int
SProcGetPointerMapping(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←GetPointerMapping])(client));
}

int
SProcChangeKeyboardControl   (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xChangeKeyboardControlReq);
    swaps(&stuff->length, n);
    swapl(&stuff->mask, n);
    SwapRestL(stuff);
    return((* ProcVector[X←ChangeKeyboardControl])(client));
}

int
SProcGetKeyboardControl(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←GetKeyboardControl])(client));

}

int
SProcBell   (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xBellReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←Bell])(client));
}

int
SProcChangePointerControl   (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xChangePointerControlReq);
    swaps(&stuff->length, n);
    swaps(&stuff->accelNum, n);
    swaps(&stuff->accelDenum, n);
    swaps(&stuff->threshold, n);
    return((* ProcVector[X←ChangePointerControl])(client));
}

int
SProcGetPointerControl(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←GetPointerControl])(client));

}

int
SProcListHosts(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xListHostsReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←ListHosts])(client));

}

int
SProcSetScreenSaver            (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xSetScreenSaverReq);
    swaps(&stuff->length, n);
    swaps(&stuff->timeout, n);
    swaps(&stuff->interval, n);
    return((* ProcVector[X←SetScreenSaver])(client));
}

int
SProcGetScreenSaver(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←GetWindowAttributes])(client));
}

int
SProcChangeHosts(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xChangeHostsReq);
    swaps(&stuff->length, n);
    swaps(&stuff->hostLength, n);
    return((* ProcVector[X←ChangeHosts])(client));

}

int
SProcChangeAccessControl(client)
    register ClientPtr client;
{
    register int n;

    REQUEST(xResourceReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←SetAccessControl])(client));

}

SProcKillClient(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xResourceReq);
    swaps(&stuff->length, n);
    swapl(&stuff->id, n);
    return((* ProcVector[X←KillClient])(client));
}
int
SProcGetFontPath(client)
    register ClientPtr client;
{
    register int n;
    REQUEST (xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←GetFontPath])(client));
}

int
SProcChangeCloseDownMode(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xResourceReq);
    swaps(&stuff->length, n);
    swapl(&stuff->id, n);
    return((* ProcVector[X←SetCloseDownMode])(client));
}

int SProcForceScreenSaver(client)
    register ClientPtr client;
{    
    register int n;
    REQUEST (xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←ForceScreenSaver])(client));
}

int SProcRotateProperties(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xRotatePropertiesReq);
    swaps(&stuff->length, n);
    swapl(&stuff->window, n);
    swaps(&stuff->nAtoms, n);
    swaps(&stuff->nPositions, n);
    return ((* ProcVector[X←RotateProperties])(client));
}

int
SProcSetModifierMapping   (client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xSetModifierMappingReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←SetModifierMapping])(client));
}

int
SProcGetModifierMapping(client)
    register ClientPtr client;
{
    register int n;
    REQUEST(xReq);
    swaps(&stuff->length, n);
    return((* ProcVector[X←GetModifierMapping])(client));
}

int SProcNoOperation(client)
    register ClientPtr client;
{
    /* noop -- don't do anything */
    return(Success);
}

SwapTimecoord(pCoord)
    xTimecoord *pCoord;
{
    register int n;

    swapl(&pCoord->time, n);
    swaps(&pCoord->x, n);
    swaps(&pCoord->y, n);
}

#ifdef ELSEWHERE
SwapCharInfo(pInfo)
    xCharInfo	*pInfo;
{
    register int n;

    swaps(&pInfo->leftSideBearing, n);
    swaps(&pInfo->rightSideBearing, n);
    swaps(&pInfo->characterWidth, n);
    swaps(&pInfo->ascent, n);
    swaps(&pInfo->descent, n);
    swaps(&pInfo->attributes, n);
}
#endif /* ELSEWHERE */

SwapFontProp(pProp)
    xFontProp  *pProp;
{
    register int n;

    swapl(&pProp->name, n);
    swapl(&pProp->value, n);
}

SwapRGB(prgb)
    xrgb	*prgb;
{
    register int n;

    swaps(&prgb->red, n);
    swaps(&prgb->green, n);
    swaps(&prgb->blue, n);
}
SwapColorItem(pItem)
    xColorItem	*pItem;
{
    register int n;

    swapl(&pItem->pixel, n);
    swaps(&pItem->red, n);
    swaps(&pItem->green, n);
    swaps(&pItem->blue, n);
}

SwapSegment(pSeg)
    xSegment	*pSeg;
{
    register int n;

    swaps(&pSeg->x1, n);
    swaps(&pSeg->y1, n);
    swaps(&pSeg->x2, n);
    swaps(&pSeg->y2, n);
}

SwapPoint(pPoint)
    xPoint	*pPoint;
{
    register int n;

    swaps(&pPoint->x, n);
    swaps(&pPoint->y, n);
}

SwapRectangle(pRect)
    xRectangle	*pRect;
{
    register int n;

    swaps(&pRect->x, n);
    swaps(&pRect->y, n);
    swaps(&pRect->width, n);
    swaps(&pRect->height, n);
}
SwapArc(pArc)
    xArc	*pArc;
{
    register int n;

    swaps(&pArc->x, n);
    swaps(&pArc->y, n);
    swaps(&pArc->width, n);
    swaps(&pArc->height, n);
    swaps(&pArc->angle1, n);
    swaps(&pArc->angle2, n);
}


SwapConnClientPrefix(pCCP)
    xConnClientPrefix	*pCCP;
{
    register int n;

    swaps(&pCCP->majorVersion, n);
    swaps(&pCCP->minorVersion, n);
    swaps(&pCCP->nbytesAuthProto, n);
    swaps(&pCCP->nbytesAuthString, n);
}