swaprep.c revision bbe1b32b
1/* $Xorg: swaprep.c,v 1.4 2001/02/09 02:05:43 xorgcvs Exp $ */ 2/* 3 * font server reply swapping 4 */ 5/* 6 7Copyright 1990, 1991, 1998 The Open Group 8 9Permission to use, copy, modify, distribute, and sell this software and its 10documentation for any purpose is hereby granted without fee, provided that 11the above copyright notice appear in all copies and that both that 12copyright notice and this permission notice appear in supporting 13documentation. 14 15The above copyright notice and this permission notice shall be included in 16all copies or substantial portions of the Software. 17 18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 25Except as contained in this notice, the name of The Open Group shall not be 26used in advertising or otherwise to promote the sale, use or other dealings 27in this Software without prior written authorization from The Open Group. 28 29 * Copyright 1990, 1991 Network Computing Devices; 30 * Portions Copyright 1987 by Digital Equipment Corporation 31 * 32 * Permission to use, copy, modify, distribute, and sell this software and 33 * its documentation for any purpose is hereby granted without fee, provided 34 * that the above copyright notice appear in all copies and that both that 35 * copyright notice and this permission notice appear in supporting 36 * documentation, and that the names of Network Computing Devices, or Digital 37 * not be used in advertising or publicity pertaining to distribution 38 * of the software without specific, written prior permission. 39 * 40 * NETWORK COMPUTING DEVICES, AND DIGITAL DISCLAIM ALL WARRANTIES WITH 41 * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF 42 * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES, 43 * OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 44 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 45 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 46 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 47 * THIS SOFTWARE. 48 */ 49/* $XFree86: xc/programs/xfs/difs/swaprep.c,v 1.4 2001/01/17 23:45:29 dawes Exp $ */ 50 51#include <swaprep.h> 52#include <swapreq.h> 53 54#include <X11/fonts/FSproto.h> 55#include "clientstr.h" 56 57static void SwapConnSetupAccept(fsConnSetupAccept *pConnSetup, fsConnSetupAccept *pConnSetupT); 58 59void 60Swap32Write( 61 ClientPtr client, 62 int size, 63 long *pbuf) 64{ 65 int n, 66 i; 67 68 size >>= 2; 69 for (i = 0; i < size; i++) { 70 swapl(&pbuf[i], n); 71 } 72 (void) WriteToClient(client, size << 2, (char *) pbuf); 73} 74 75void 76Swap16Write( 77 ClientPtr client, 78 int size, 79 short *pbuf) 80{ 81 int n, 82 i; 83 84 size >>= 1; 85 for (i = 0; i < size; i++) { 86 swaps(&pbuf[i], n); 87 } 88 (void) WriteToClient(client, size << 1, (char *) pbuf); 89} 90 91void 92CopySwap32Write( 93 ClientPtr client, 94 int size, 95 long *pbuf) 96{ 97 int bufsize = size; 98 long *pbufT; 99 long *from, 100 *to, 101 *fromLast, 102 *toLast; 103 long tmpbuf[1]; 104 105 while (!(pbufT = (long *) ALLOCATE_LOCAL(bufsize))) { 106 bufsize >>= 1; 107 if (bufsize == 4) { 108 pbufT = tmpbuf; 109 break; 110 } 111 } 112 /* convert lengths from # of bytes to # of longs */ 113 size >>= 2; 114 bufsize >>= 2; 115 116 from = pbuf; 117 fromLast = from + size; 118 while (from < fromLast) { 119 int nbytes; 120 121 to = pbufT; 122 toLast = to + min(bufsize, fromLast - from); 123 nbytes = (toLast - to) << 2; 124 while (to < toLast) { 125 /* 126 * can't write "cpswapl(*from++, *to++)" because cpswapl is a 127 * macro that evaulates its args more than once 128 */ 129 cpswapl(*from, *to); 130 from++; 131 to++; 132 } 133 (void) WriteToClient(client, nbytes, (char *) pbufT); 134 } 135 136 if (pbufT != tmpbuf) 137 DEALLOCATE_LOCAL((char *) pbufT); 138} 139 140void 141CopySwap16Write( 142 ClientPtr client, 143 int size, 144 short *pbuf) 145{ 146 int bufsize = size; 147 short *pbufT; 148 register short *from, 149 *to, 150 *fromLast, 151 *toLast; 152 short tmpbuf[2]; 153 154 /* Allocate as big a buffer as we can... */ 155 while (!(pbufT = (short *) ALLOCATE_LOCAL(bufsize))) { 156 bufsize >>= 1; 157 if (bufsize == 4) { 158 pbufT = tmpbuf; 159 break; 160 } 161 } 162 163 /* convert lengths from # of bytes to # of shorts */ 164 size >>= 1; 165 bufsize >>= 1; 166 167 from = pbuf; 168 fromLast = from + size; 169 while (from < fromLast) { 170 int nbytes; 171 172 to = pbufT; 173 toLast = to + min(bufsize, fromLast - from); 174 nbytes = (toLast - to) << 1; 175 while (to < toLast) { 176 /* 177 * can't write "cpswaps(*from++, *to++)" because cpswaps is a 178 * macro that evaulates its args more than once 179 */ 180 cpswaps(*from, *to); 181 from++; 182 to++; 183 } 184 (void) WriteToClient(client, nbytes, (char *) pbufT); 185 } 186 187 if (pbufT != tmpbuf) 188 DEALLOCATE_LOCAL((char *) pbufT); 189} 190 191 192#undef pRep 193#define pRep ((fsGenericReply *)data) 194 195void 196SGenericReply( 197 ClientPtr client, 198 int size, 199 void * data) 200{ 201 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 202 pRep->length = lswapl(pRep->length); 203 (void) WriteToClient(client, size, (char *) pRep); 204} 205 206 207#undef pRep 208#define pRep ((fsListExtensionsReply *)data) 209 210void 211SListExtensionsReply( 212 ClientPtr client, 213 int size, 214 void * data) 215{ 216 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 217 pRep->length = lswapl(pRep->length); 218 (void) WriteToClient(client, size, (char *) pRep); 219} 220 221#undef pRep 222#define pRep ((fsQueryExtensionReply *)data) 223 224void 225SQueryExtensionReply( 226 ClientPtr client, 227 int size, 228 void * data) 229{ 230 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 231 pRep->length = lswapl(pRep->length); 232 pRep->major_version = lswaps(pRep->major_version); 233 pRep->minor_version = lswaps(pRep->minor_version); 234 (void) WriteToClient(client, size, (char *) pRep); 235} 236 237#undef pRep 238#define pRep ((fsListCataloguesReply *)data) 239 240void 241SListCataloguesReply( 242 ClientPtr client, 243 int size, 244 void * data) 245{ 246 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 247 pRep->length = lswapl(pRep->length); 248 pRep->num_replies = lswapl(pRep->num_replies); 249 pRep->num_catalogues = lswapl(pRep->num_catalogues); 250 (void) WriteToClient(client, size, (char *) pRep); 251} 252 253#undef pRep 254#define pRep ((fsCreateACReply *)data) 255 256void 257SCreateACReply( 258 ClientPtr client, 259 int size, 260 void * data) 261{ 262 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 263 pRep->length = lswapl(pRep->length); 264 pRep->status = lswaps(pRep->status); 265 (void) WriteToClient(client, size, (char *) pRep); 266} 267 268#undef pRep 269#define pRep ((fsGetEventMaskReply *)data) 270 271void 272SGetEventMaskReply( 273 ClientPtr client, 274 int size, 275 void * data) 276{ 277 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 278 pRep->length = lswapl(pRep->length); 279 pRep->event_mask = lswapl(pRep->event_mask); 280 (void) WriteToClient(client, size, (char *) pRep); 281} 282 283#undef pRep 284#define pRep ((fsGetResolutionReply *)data) 285 286void 287SGetResolutionReply( 288 ClientPtr client, 289 int size, 290 void * data) 291{ 292 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 293 pRep->length = lswapl(pRep->length); 294 (void) WriteToClient(client, size, (char *) pRep); 295} 296 297#undef pRep 298#define pRep ((fsListFontsReply *)data) 299 300void 301SListFontsReply( 302 ClientPtr client, 303 int size, 304 void * data) 305{ 306 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 307 pRep->length = lswapl(pRep->length); 308 pRep->following = lswapl(pRep->following); 309 pRep->nFonts = lswapl(pRep->nFonts); 310 (void) WriteToClient(client, size, (char *) pRep); 311} 312 313#define SwapXFontInfoHeader(reply) \ 314 reply->font_header_flags = lswapl(reply->font_header_flags); \ 315 \ 316 reply->font_header_min_bounds_left = lswaps(reply->font_header_min_bounds_left); \ 317 reply->font_header_min_bounds_right = lswaps(reply->font_header_min_bounds_right); \ 318 reply->font_header_min_bounds_width = lswaps(reply->font_header_min_bounds_width); \ 319 reply->font_header_min_bounds_ascent = lswaps(reply->font_header_min_bounds_ascent); \ 320 reply->font_header_min_bounds_descent = lswaps(reply->font_header_min_bounds_descent); \ 321 reply->font_header_min_bounds_attributes = lswaps(reply->font_header_min_bounds_attributes); \ 322 \ 323 reply->font_header_max_bounds_left = lswaps(reply->font_header_max_bounds_left); \ 324 reply->font_header_max_bounds_right = lswaps(reply->font_header_max_bounds_right); \ 325 reply->font_header_max_bounds_width = lswaps(reply->font_header_max_bounds_width); \ 326 reply->font_header_max_bounds_ascent = lswaps(reply->font_header_max_bounds_ascent); \ 327 reply->font_header_max_bounds_descent = lswaps(reply->font_header_max_bounds_descent); \ 328 reply->font_header_max_bounds_attributes = lswaps(reply->font_header_max_bounds_attributes); \ 329 \ 330 reply->font_header_font_ascent = lswaps(reply->font_header_font_ascent); \ 331 reply->font_header_font_descent = lswaps(reply->font_header_font_descent) 332 333#undef pRep 334#define pRep ((fsListFontsWithXInfoReply *)data) 335 336void 337SListFontsWithXInfoReply( 338 ClientPtr client, 339 int size, 340 void * data) 341{ 342 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 343 pRep->length = lswapl(pRep->length); 344 if (size > SIZEOF(fsGenericReply)) { /* not last in series? */ 345 pRep->nReplies = lswapl(pRep->nReplies); 346 SwapXFontInfoHeader(pRep); 347 } 348 (void) WriteToClient(client, size, (char *) pRep); 349} 350 351#undef pRep 352#define pRep ((fsOpenBitmapFontReply *)data) 353 354void 355SOpenBitmapFontReply( 356 ClientPtr client, 357 int size, 358 void * data) 359{ 360 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 361 pRep->length = lswapl(pRep->length); 362 pRep->otherid = lswapl(pRep->otherid); 363 364 (void) WriteToClient(client, size, (char *) pRep); 365} 366 367#undef pRep 368#define pRep ((fsQueryXInfoReply *)data) 369 370void 371SQueryXInfoReply( 372 ClientPtr client, 373 int size, 374 void * data) 375{ 376 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 377 pRep->length = lswapl(pRep->length); 378 SwapXFontInfoHeader(pRep); 379 (void) WriteToClient(client, size, (char *) pRep); 380} 381 382#undef pRep 383#define pRep ((fsQueryXExtents8Reply *)data) 384 385void 386SQueryXExtentsReply( 387 ClientPtr client, 388 int size, 389 void * data) /* QueryXExtents16Reply is the same */ 390{ 391 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 392 pRep->length = lswapl(pRep->length); 393 pRep->num_extents = lswapl(pRep->num_extents); 394 (void) WriteToClient(client, size, (char *) pRep); 395} 396 397#undef pRep 398#define pRep ((fsQueryXBitmaps8Reply *)data) 399 400void 401SQueryXBitmapsReply( 402 ClientPtr client, 403 int size, 404 void * data) /* QueryXBitmaps16Reply is the same */ 405{ 406 pRep->sequenceNumber = lswaps(pRep->sequenceNumber); 407 pRep->length = lswapl(pRep->length); 408 pRep->replies_hint = lswapl(pRep->replies_hint); 409 pRep->num_chars = lswapl(pRep->num_chars); 410 pRep->nbytes = lswapl(pRep->nbytes); 411 (void) WriteToClient(client, size, (char *) pRep); 412} 413 414void 415SErrorEvent(fsError *error, fsError *perror) 416{ 417 *perror = *error; 418 perror->sequenceNumber = lswaps(perror->sequenceNumber); 419 perror->length = lswapl(perror->length); 420 perror->timestamp = lswapl(perror->timestamp); 421} 422 423void 424WriteSConnectionInfo( 425 ClientPtr client, 426 unsigned long size, 427 char *pInfo) 428{ 429 char *pInfoT, 430 *pInfoTBase; 431 fsConnSetupAccept *pConnSetup = (fsConnSetupAccept *) pInfo; 432 int i; 433 434 pInfoT = pInfoTBase = (char *) ALLOCATE_LOCAL(size); 435 if (!pInfoT) { 436 client->noClientException = -2; 437 return; 438 } 439 SwapConnSetupAccept(pConnSetup, (fsConnSetupAccept *) pInfoT); 440 pInfoT += SIZEOF(fsConnSetup); 441 pInfo += SIZEOF(fsConnSetup); 442 443 i = (pConnSetup->vendor_len + 3) & ~3; 444 memmove( pInfoT, pInfo, i); 445 446 (void) WriteToClient(client, (int) size, (char *) pInfoTBase); 447 DEALLOCATE_LOCAL(pInfoTBase); 448} 449 450static void 451SwapConnSetupAccept(fsConnSetupAccept *pConnSetup, fsConnSetupAccept *pConnSetupT) 452{ 453 pConnSetupT->length = lswapl(pConnSetup->length); 454 pConnSetupT->max_request_len = lswaps(pConnSetup->max_request_len); 455 pConnSetupT->vendor_len = lswaps(pConnSetup->vendor_len); 456 pConnSetupT->release_number = lswapl(pConnSetup->release_number); 457} 458 459void 460WriteSConnSetup(ClientPtr client, fsConnSetup *pcsp) 461{ 462 fsConnSetup cspT; 463 464 cspT.status = lswaps(pcsp->status); 465 cspT.major_version = lswaps(pcsp->major_version); 466 cspT.minor_version = lswaps(pcsp->minor_version); 467 cspT.num_alternates = pcsp->num_alternates; 468 cspT.auth_index = pcsp->auth_index; 469 cspT.alternate_len = lswaps(pcsp->alternate_len); 470 cspT.auth_len = lswaps(pcsp->auth_len); 471 (void) WriteToClient(client, SIZEOF(fsConnSetup), (char *) &cspT); 472} 473 474static void 475SwapPropOffset(char *po) 476{ 477 int i, n; 478 479 for (i=0; i<4; i++) 480 { 481 swapl(po, n); 482 po += 4; 483 } 484} 485 486void 487SwapPropInfo(fsPropInfo *pi) 488{ 489 int i; 490 char *po; 491 492 po = (char *) pi + SIZEOF(fsPropInfo); 493 for (i = 0; i < pi->num_offsets; i++) 494 { 495 SwapPropOffset(po); 496 po += SIZEOF(fsPropOffset); 497 } 498 499 pi->num_offsets = lswapl(pi->num_offsets); 500 pi->data_len = lswapl(pi->data_len); 501} 502 503void 504SwapExtents(fsXCharInfo *extents, int num) 505{ 506 SwapShorts((short *)extents, num * (SIZEOF(fsXCharInfo) / 2)); 507} 508