⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xprint.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 5 页
字号:
}/* * XpFreePage is the routine called by dix:FreeResource to free the page * resource built with the same ID as a page window.  It checks to see * if we're in the middle of a page, and if so calls the driver's EndPage * function with 'cancel' set TRUE.  It frees the memory associated with * the page resource. */static intXpFreePage(data, id)    pointer data;    XID id;{    XpPagePtr page = (XpPagePtr)data;    int result = Success;    WindowPtr pWin = (WindowPtr )LookupIDByType(id, RT_WINDOW);    /* Check to see if the window's being deleted in the middle of a page */    if(page->context != (XpContextPtr)NULL &&        page->context->state & PAGE_STARTED)    {	XpScreenPtr pPrintScreen = XpScreens[page->context->screenNum];	if(page->context->funcs.EndPage != (int (*)())NULL)	    result = page->context->funcs.EndPage(page->context, pWin, TRUE);        SendXpNotify(page->context, XPEndPageNotify, (int)TRUE);	page->context->pageWin = 0; /* None, NULL??? XXX */    }    xfree(page);    return result;}/* * ContextPrivate machinery. * Context privates are intended for use by the drivers, allowing the * drivers to maintain context-specific data.  The driver should free * the associated data at DestroyContext time. */static voidInitContextPrivates(context)    XpContextPtr context;{    register char *ptr;    DevUnion *ppriv;    register unsigned *sizes;    register unsigned size;    register int i;    if (totalContextSize == sizeof(XpContextRec))        ppriv = (DevUnion *)NULL;    else         ppriv = (DevUnion *)(context + 1);    context->devPrivates = ppriv;    sizes = contextPrivateSizes;    ptr = (char *)(ppriv + contextPrivateLen);    for (i = contextPrivateLen; --i >= 0; ppriv++, sizes++)    {        if ( (size = *sizes) )        {            ppriv->ptr = (pointer)ptr;            ptr += size;        }        else            ppriv->ptr = (pointer)NULL;    }}static voidResetContextPrivates(){    contextPrivateCount = 0;    contextPrivateLen = 0;    xfree(contextPrivateSizes);    contextPrivateSizes = (unsigned *)NULL;    totalContextSize = sizeof(XpContextRec);}intXpAllocateContextPrivateIndex(){    return contextPrivateCount++;}BoolXpAllocateContextPrivate(index, amount)    int index;    unsigned amount;{    unsigned oldamount;    if (index >= contextPrivateLen)    {        unsigned *nsizes;        nsizes = (unsigned *)xrealloc(contextPrivateSizes,                                      (index + 1) * sizeof(unsigned));        if (!nsizes)            return FALSE;        while (contextPrivateLen <= index)        {            nsizes[contextPrivateLen++] = 0;            totalContextSize += sizeof(DevUnion);        }        contextPrivateSizes = nsizes;    }    oldamount = contextPrivateSizes[index];    if (amount > oldamount)    {        contextPrivateSizes[index] = amount;        totalContextSize += (amount - oldamount);    }    return TRUE;}static XpClientPtrAcquireClient(pContext, client)    XpContextPtr pContext;    ClientPtr client;{    XpClientPtr pXpClient;    if((pXpClient = FindClient(pContext, client)) != (XpClientPtr)NULL)	return pXpClient;    if((pXpClient = CreateXpClient(client)) == (XpClientPtr)NULL)	    return (XpClientPtr)NULL;    pXpClient->context = pContext;    pXpClient->pNext = pContext->clientHead;    pContext->clientHead = pXpClient;    return pXpClient;}static XpClientPtrFindClient(pContext, client)    XpContextPtr pContext;    ClientPtr client;{    XpClientPtr pXpClient;    for(pXpClient = pContext->clientHead; pXpClient != (XpClientPtr)NULL;	pXpClient = pXpClient->pNext)    {	if(pXpClient->client == client)  return pXpClient;    }    return (XpClientPtr)NULL;}/****************************************************************************** * * Start/End Functions: StartJob, EndJob, StartDoc, EndDoc, StartPage, EndPage * ******************************************************************************/static intProcXpStartJob(client)    ClientPtr client;{    REQUEST(xPrintStartJobReq);    XpContextPtr pContext;    int result = Success;    XpScreenPtr pPrintScreen;    REQUEST_SIZE_MATCH(xPrintStartJobReq);    /* Check to see that a context has been established by this client. */    if((pContext = (XpContextPtr)client->devPrivates[XpClientPrivateIndex].ptr)       == (XpContextPtr)NULL)        return XpErrorBase+XPBadContext;    if(pContext->state != 0)	return XpErrorBase+XPBadSequence;    if(stuff->saveData != XPSpool && stuff->saveData != XPGetData)    {	client->errorValue = stuff->saveData;	return BadValue;    }    pPrintScreen = XpScreens[pContext->screenNum];    if(pContext->funcs.StartJob != (int (*)())NULL)        result = pContext->funcs.StartJob(pContext, 			 (stuff->saveData == XPGetData)? TRUE:FALSE);    else        return BadImplementation;    pContext->state = JOB_STARTED;    if(stuff->saveData == XPGetData)	pContext->state |= JOB_GET_DATA;    SendXpNotify(pContext, XPStartJobNotify, FALSE);    if (client->noClientException != Success)        return client->noClientException;    else        return result;}static intProcXpEndJob(client)    ClientPtr client;{    REQUEST(xPrintEndJobReq);    XpScreenPtr pPrintScreen;    WindowPtr pWin;    int result = Success;    XpContextPtr pContext;    REQUEST_SIZE_MATCH(xPrintEndJobReq);    if((pContext = (XpContextPtr)client->devPrivates[XpClientPrivateIndex].ptr)       == (XpContextPtr)NULL)        return XpErrorBase+XPBadSequence;    pPrintScreen = XpScreens[pContext->screenNum];    if(!(pContext->state & JOB_STARTED))	return XpErrorBase+XPBadSequence;        /* Check for missing EndDoc */    if((pContext->state & DOC_RAW_STARTED) ||        (pContext->state & DOC_COOKED_STARTED))    {	if(pContext->state & PAGE_STARTED)	{	    WindowPtr pWin = (WindowPtr )LookupIDByType(					   pContext->pageWin, RT_WINDOW);	    XpPagePtr pPage = (XpPagePtr)LookupIDByType(				       pContext->pageWin, RTpage);	    if(stuff->cancel != TRUE)	        return XpErrorBase+XPBadSequence;            if(pContext->funcs.EndPage != (int (*)())NULL)                result = pContext->funcs.EndPage(pContext, pWin, TRUE);            else	        return BadImplementation;	    SendXpNotify(pContext, XPEndPageNotify, TRUE);	    pContext->state &= ~PAGE_STARTED;	    if(pPage)	        pPage->context = (XpContextPtr)NULL;	    if(result != Success) return result;	}        if(pContext->funcs.EndDoc != (int (*)())NULL)            result = pContext->funcs.EndDoc(pContext, stuff->cancel);        else	    return BadImplementation;        SendXpNotify(pContext, XPEndDocNotify, stuff->cancel);    }    if(pContext->funcs.EndJob != (int (*)())NULL)        result = pContext->funcs.EndJob(pContext, stuff->cancel);    else	return BadImplementation;    pContext->state = 0;    SendXpNotify(pContext, XPEndJobNotify, stuff->cancel);    if (client->noClientException != Success)        return client->noClientException;    else        return result;}static BoolDoStartDoc(client, c)    ClientPtr client;    XpStDocPtr c;{    XpScreenPtr pPrintScreen;    int result = Success;    XpContextPtr pContext = c->pContext;    if(c->pContext->state & JOB_GET_DATA &&        !(c->pContext->state & GET_DOC_DATA_STARTED))    {	if(!c->slept)	{	    c->slept = TRUE;	    ClientSleep(client, (ClientSleepProcPtr)DoStartDoc, (pointer) c);	    c->pContext->clientSlept = client;	}	return TRUE;    }        pPrintScreen = XpScreens[pContext->screenNum];    if(pContext->funcs.StartDoc != (int (*)())NULL)        result = pContext->funcs.StartDoc(pContext, c->type);    else    {	    SendErrorToClient(client, XpReqCode, X_PrintStartPage, 0, 			      BadImplementation);	    return TRUE;    }    if(c->type == XPDocNormal)        pContext->state |= DOC_COOKED_STARTED;    else	pContext->state |= DOC_RAW_STARTED;    SendXpNotify(pContext, XPStartDocNotify, (int)FALSE);    xfree(c);    return TRUE;}static intProcXpStartDoc(client)    ClientPtr client;{    REQUEST(xPrintStartDocReq);    XpScreenPtr pPrintScreen;    int result = Success;    XpContextPtr pContext;    XpStDocPtr c;    REQUEST_SIZE_MATCH(xPrintStartDocReq);    if((pContext = (XpContextPtr)client->devPrivates[XpClientPrivateIndex].ptr)       == (XpContextPtr)NULL)        return XpErrorBase+XPBadSequence;    if(!(pContext->state & JOB_STARTED) ||        pContext->state & DOC_RAW_STARTED ||       pContext->state & DOC_COOKED_STARTED)	return XpErrorBase+XPBadSequence;    if(stuff->type != XPDocNormal && stuff->type != XPDocRaw)    {	client->errorValue = stuff->type;	return BadValue;    }    c = (XpStDocPtr)xalloc(sizeof(XpStDocRec));    c->pContext = pContext;    c->type = stuff->type;    c->slept = FALSE;    (void)DoStartDoc(client, c);    if (client->noClientException != Success)        return client->noClientException;    else        return result;}static intProcXpEndDoc(client)    ClientPtr client;{    REQUEST(xPrintEndDocReq);    XpScreenPtr pPrintScreen;    XpContextPtr pContext;    int result = Success;    REQUEST_SIZE_MATCH(xPrintEndDocReq);    if((pContext = (XpContextPtr)client->devPrivates[XpClientPrivateIndex].ptr)       == (XpContextPtr)NULL)        return XpErrorBase+XPBadSequence;    pPrintScreen = XpScreens[pContext->screenNum];    if(!(pContext->state & DOC_RAW_STARTED) &&       !(pContext->state & DOC_COOKED_STARTED))	return XpErrorBase+XPBadSequence;        if(pContext->state & PAGE_STARTED)    {	if(stuff->cancel == TRUE)	{	    WindowPtr pWin = (WindowPtr )LookupIDByType(					   pContext->pageWin, RT_WINDOW);	    XpPagePtr pPage = (XpPagePtr)LookupIDByType(				       pContext->pageWin, RTpage);            if(pContext->funcs.EndPage != (int (*)())NULL)                result = pContext->funcs.EndPage(pContext, pWin, TRUE);            else	        return BadImplementation;	    SendXpNotify(pContext, XPEndPageNotify, TRUE);	    if(pPage)	        pPage->context = (XpContextPtr)NULL;	}	else	    return XpErrorBase+XPBadSequence;	if(result != Success)	    return result;    }    if(pContext->funcs.EndDoc != (int (*)())NULL)        result = pContext->funcs.EndDoc(pContext, stuff->cancel);    else	return BadImplementation;    pContext->state &= ~DOC_RAW_STARTED;    pContext->state &= ~DOC_COOKED_STARTED;    SendXpNotify(pContext, XPEndDocNotify, stuff->cancel);    if (client->noClientException != Success)        return client->noClientException;    else        return result;}static BoolDoStartPage(client, c)    ClientPtr client;    XpStPagePtr c;{    XpScreenPtr pPrintScreen;    WindowPtr pWin = c->pWin;    int result = Success;    XpContextPtr pContext = c->pContext;    XpPagePtr pPage;    if(c->pContext->state & JOB_GET_DATA &&        !(c->pContext->state & GET_DOC_DATA_STARTED))    {	if(!c->slept)	{	    c->slept = TRUE;	    ClientSleep(client, (ClientSleepProcPtr)DoStartPage, (pointer) c);	    c->pContext->clientSlept = client;	}	return TRUE;    }    if(!(pContext->state & DOC_COOKED_STARTED))    {	/* Implied StartDoc if it was omitted */        if(pContext->funcs.StartDoc != (int (*)())NULL)            result = pContext->funcs.StartDoc(pContext, XPDocNormal);        else	{	    SendErrorToClient(client, XpReqCode, X_PrintStartPage, 0, 			      BadImplementation);	    return TRUE;	}	if(result != Success) 	{	    SendErrorToClient(client, XpReqCode, X_PrintStartPage, 0, result);	    return TRUE;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -