📄 xprint.c
字号:
{ case X_PrintQueryVersion: return ProcXpQueryVersion(client); case X_PrintGetPrinterList: return ProcXpGetPrinterList(client); case X_PrintCreateContext: return ProcXpCreateContext(client); case X_PrintSetContext: return ProcXpSetContext(client); case X_PrintGetContext: return ProcXpGetContext(client); case X_PrintDestroyContext: return ProcXpDestroyContext(client); case X_PrintGetContextScreen: return ProcXpGetContextScreen(client); case X_PrintStartJob: return ProcXpStartJob(client); case X_PrintEndJob: return ProcXpEndJob(client); case X_PrintStartDoc: return ProcXpStartDoc(client); case X_PrintEndDoc: return ProcXpEndDoc(client); case X_PrintStartPage: return ProcXpStartPage(client); case X_PrintEndPage: return ProcXpEndPage(client); case X_PrintSelectInput: return ProcXpSelectInput(client); case X_PrintInputSelected: return ProcXpInputSelected(client); case X_PrintPutDocumentData: return ProcXpPutDocumentData(client); case X_PrintGetDocumentData: return ProcXpGetDocumentData(client); case X_PrintSetAttributes: return ProcXpSetAttributes(client); case X_PrintGetAttributes: return ProcXpGetAttributes(client); case X_PrintGetOneAttribute: return ProcXpGetOneAttribute(client); case X_PrintRehashPrinterList: return ProcXpRehashPrinterList(client); case X_PrintQueryScreens: return ProcXpQueryScreens(client); case X_PrintGetPageDimensions: return ProcXpGetPageDimensions(client); case X_PrintSetImageResolution: return ProcXpSetImageResolution(client); case X_PrintGetImageResolution: return ProcXpGetImageResolution(client); default: return BadRequest; }}static int ProcXpSwappedDispatch(client) ClientPtr client;{ int temp; REQUEST(xReq); switch(stuff->data) { case X_PrintQueryVersion: swaps(&stuff->length, temp); return ProcXpQueryVersion(client); case X_PrintGetPrinterList: return SProcXpGetPrinterList(client); case X_PrintCreateContext: return SProcXpCreateContext(client); case X_PrintSetContext: return SProcXpSetContext(client); case X_PrintGetContext: return SProcXpGetContext(client); case X_PrintDestroyContext: return SProcXpDestroyContext(client); case X_PrintGetContextScreen: return SProcXpGetContextScreen(client); case X_PrintStartJob: return SProcXpStartJob(client); case X_PrintEndJob: return SProcXpEndJob(client); case X_PrintStartDoc: return SProcXpStartDoc(client); case X_PrintEndDoc: return SProcXpEndDoc(client); case X_PrintStartPage: return SProcXpStartPage(client); case X_PrintEndPage: return SProcXpEndPage(client); case X_PrintSelectInput: return SProcXpSelectInput(client); case X_PrintInputSelected: return SProcXpInputSelected(client); case X_PrintPutDocumentData: return SProcXpPutDocumentData(client); case X_PrintGetDocumentData: return SProcXpGetDocumentData(client); case X_PrintSetAttributes: return SProcXpSetAttributes(client); case X_PrintGetAttributes: return SProcXpGetAttributes(client); case X_PrintGetOneAttribute: return SProcXpGetOneAttribute(client); case X_PrintRehashPrinterList: return SProcXpRehashPrinterList(client); case X_PrintQueryScreens: swaps(&stuff->length, temp); return ProcXpQueryScreens(client); case X_PrintGetPageDimensions: return SProcXpGetPageDimensions(client); case X_PrintSetImageResolution: return SProcXpSetImageResolution(client); case X_PrintGetImageResolution: return SProcXpGetImageResolution(client); default: return BadRequest; }}static intProcXpQueryVersion(client) ClientPtr client;{ REQUEST(xPrintQueryVersionReq); xPrintQueryVersionReply rep; register int n; long l; REQUEST_SIZE_MATCH(xPrintQueryVersionReq); rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; rep.majorVersion = XP_MAJOR_VERSION; rep.minorVersion = XP_MINOR_VERSION; if (client->swapped) { swaps(&rep.sequenceNumber, n); swapl(&rep.length, l); swaps(&rep.majorVersion, n); swaps(&rep.minorVersion, n); } WriteToClient(client, sz_xPrintQueryVersionReply, (char *)&rep); return client->noClientException;}/******************************************************************************* * * GetPrinterList : Return a list of all printers associated with this * server. Calls XpDiGetPrinterList, which is defined in * the device-independent code in Xserver/Xprint. * ******************************************************************************/static intProcXpGetPrinterList(client) ClientPtr client;{ REQUEST(xPrintGetPrinterListReq); int totalSize, numEntries; XpDiListEntry **pList, *pEntry; xPrintGetPrinterListReply *rep; int n, i, totalBytes; long l; char *curByte; REQUEST_AT_LEAST_SIZE(xPrintGetPrinterListReq); totalSize = ((sz_xPrintGetPrinterListReq) >> 2) + ((stuff->printerNameLen + 3) >> 2) + ((stuff->localeLen + 3) >> 2); if(totalSize != client->req_len) return BadLength; pList = XpDiGetPrinterList(stuff->printerNameLen, (char *)(stuff + 1), stuff->localeLen, (char *)((stuff + 1) + QUADPAD(stuff->printerNameLen))); for(numEntries = 0, totalBytes = sz_xPrintGetPrinterListReply; pList[numEntries] != (XpDiListEntry *)NULL; numEntries++) { totalBytes += 2 * sizeof(CARD32); totalBytes += QUADPAD(strlen(pList[numEntries]->name)); totalBytes += QUADPAD(strlen(pList[numEntries]->description)); } if((rep = (xPrintGetPrinterListReply *)xalloc(totalBytes)) == (xPrintGetPrinterListReply *)NULL) return BadAlloc; rep->type = X_Reply; rep->length = (totalBytes - sz_xPrintGetPrinterListReply) >> 2; rep->sequenceNumber = client->sequence; rep->listCount = numEntries; if (client->swapped) { swaps(&rep->sequenceNumber, n); swapl(&rep->length, l); swapl(&rep->listCount, l); } for(i = 0, curByte = (char *)(rep + 1); i < numEntries; i++) { CARD32 *pCrd; int len; pCrd = (CARD32 *)curByte; len = strlen(pList[i]->name); *pCrd = len; if (client->swapped) swapl((long *)curByte, l); curByte += sizeof(CARD32); strncpy(curByte, pList[i]->name, len); curByte += QUADPAD(len); pCrd = (CARD32 *)curByte; len = strlen(pList[i]->description); *pCrd = len; if (client->swapped) swapl((long *)curByte, l); curByte += sizeof(CARD32); strncpy(curByte, pList[i]->description, len); curByte += QUADPAD(len); } XpDiFreePrinterList(pList); WriteToClient(client, totalBytes, (char *)rep); xfree(rep); return client->noClientException;}/******************************************************************************* * * QueryScreens: Returns the list of screens which are associated with * print drivers. * ******************************************************************************/static intProcXpQueryScreens(client) ClientPtr client;{ REQUEST(xPrintQueryScreensReq); int i, numPrintScreens, totalSize; WINDOW *pWinId; xPrintQueryScreensReply *rep; long l; REQUEST_SIZE_MATCH(xPrintQueryScreensReq); rep = (xPrintQueryScreensReply *)xalloc(sz_xPrintQueryScreensReply); pWinId = (WINDOW *)(rep + 1); for(i = 0, numPrintScreens = 0, totalSize = sz_xPrintQueryScreensReply; i < MAXSCREENS; i++) { /* * If a screen has registered with our extension, then it's * a printer screen. */ if(XpScreens[i] != (XpScreenPtr)NULL) { numPrintScreens++; totalSize += sizeof(WINDOW); rep = (xPrintQueryScreensReply *)xrealloc(rep, totalSize); *pWinId = WindowTable[i]->drawable.id; if (client->swapped) swapl((long *)pWinId, l); pWinId++; } } rep->type = X_Reply; rep->sequenceNumber = client->sequence; rep->length = (totalSize - sz_xPrintQueryScreensReply) >> 2; rep->listCount = numPrintScreens; if (client->swapped) { int n; swaps(&rep->sequenceNumber, n); swapl(&rep->length, l); swapl(&rep->listCount, l); } WriteToClient(client, totalSize, (char *)rep); xfree(rep); return client->noClientException;}static int ProcXpGetPageDimensions(client) ClientPtr client;{ REQUEST(xPrintGetPageDimensionsReq); CARD16 width, height; xRectangle rect; xPrintGetPageDimensionsReply rep; XpContextPtr pContext; int result; REQUEST_SIZE_MATCH(xPrintGetPageDimensionsReq); if((pContext =(XpContextPtr)SecurityLookupIDByType(client, stuff->printContext, RTcontext, SecurityReadAccess)) == (XpContextPtr)NULL) { client->errorValue = stuff->printContext; return XpErrorBase+XPBadContext; } if(pContext->funcs.GetMediumDimensions != (int (*)())NULL) result = pContext->funcs.GetMediumDimensions(pContext, &width, &height); else return BadImplementation; if(pContext->funcs.GetReproducibleArea != (int (*)())NULL) result = pContext->funcs.GetReproducibleArea(pContext, &rect); else return BadImplementation; rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.length = 0; rep.width = width; rep.height = height; rep.rx = rect.x; rep.ry = rect.y; rep.rwidth = rect.width; rep.rheight = rect.height; if(client->swapped) { int n; long l; swaps(&rep.sequenceNumber, n); swapl(&rep.length, l); swaps(&rep.width, n); swaps(&rep.height, n); swaps(&rep.rx, n); swaps(&rep.ry, n); swaps(&rep.rwidth, n); swaps(&rep.rheight, n); } WriteToClient(client, sz_xPrintGetPageDimensionsReply, (char *)&rep); return client->noClientException;}static int ProcXpSetImageResolution(client) ClientPtr client;{ REQUEST(xPrintSetImageResolutionReq); xPrintSetImageResolutionReply rep; XpContextPtr pContext; Bool status; int result; REQUEST_SIZE_MATCH(xPrintSetImageResolutionReq); if((pContext =(XpContextPtr)SecurityLookupIDByType(client, stuff->printContext, RTcontext, SecurityWriteAccess)) == (XpContextPtr)NULL) { client->errorValue = stuff->printContext; return XpErrorBase+XPBadContext; } rep.prevRes = pContext->imageRes; if(pContext->funcs.SetImageResolution != (int (*)())NULL) result = pContext->funcs.SetImageResolution(pContext, (int)stuff->imageRes, &status); else status = FALSE; rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.length = 0; rep.status = status; if(client->swapped) { int n; long l; swaps(&rep.sequenceNumber, n); swapl(&rep.length, l); swaps(&rep.prevRes, n); } WriteToClient(client, sz_xPrintSetImageResolutionReply, (char *)&rep); return client->noClientException;}static int ProcXpGetImageResolution(client) ClientPtr client;{ REQUEST(xPrintGetImageResolutionReq); xPrintGetImageResolutionReply rep; XpContextPtr pContext; Bool status; int result; REQUEST_SIZE_MATCH(xPrintGetImageResolutionReq); if((pContext =(XpContextPtr)SecurityLookupIDByType(client, stuff->printContext, RTcontext, SecurityReadAccess)) == (XpContextPtr)NULL) { client->errorValue = stuff->printContext; return XpErrorBase+XPBadContext; } rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.length = 0; rep.imageRes = pContext->imageRes; if(client->swapped) { int n; long l; swaps(&rep.sequenceNumber, n); swapl(&rep.length, l); swaps(&rep.imageRes, n); } WriteToClient(client, sz_xPrintGetImageResolutionReply, (char *)&rep); return client->noClientException;}/******************************************************************************* * * RehashPrinterList : Cause the server's list of printers to be rebuilt. * This allows new printers to be added, or old ones * deleted without needing to restart the server. * ******************************************************************************/static intProcXpRehashPrinterList(client) ClientPtr client;{ REQUEST(xPrintRehashPrinterListReq); REQUEST_SIZE_MATCH(xPrintRehashPrinterListReq); return XpRehashPrinterList();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -