/********************************************************************** * WriteSpool (GDI.241) * WriteSpool16 (GDI32.@) * */ INT16 WINAPI WriteSpool16(HPJOB16 hJob, LPSTR lpData, INT16 cch) { int nRet = SP_ERROR; PPRINTJOB pPrintJob = NULL; TRACE("%04x %08lx %04x\n", hJob, (DWORD)lpData, cch); pPrintJob = FindPrintJobFromHandle(hJob); if (pPrintJob != NULL && pPrintJob->fd >= 0 && cch) { if (write(pPrintJob->fd, lpData, cch) != cch) nRet = SP_OUTOFDISK; else nRet = cch; #if 0 /* FIXME: We just cannot call 16 bit functions from here, since we * have acquired several locks (DC). And we do not really need to. */ if (pPrintJob->hDC == 0) { TRACE("hDC == 0 so no QueryAbort\n"); } else if (!(QueryAbort16(pPrintJob->hDC, (nRet == SP_OUTOFDISK) ? nRet : 0 ))) { CloseJob16(hJob); /* printing aborted */ nRet = SP_APPABORT; } #endif } return nRet; }
static int FreePrintJob(HANDLE16 hJob) { int nRet = SP_ERROR; PPRINTJOB pPrintJob; pPrintJob = FindPrintJobFromHandle(hJob); if (pPrintJob != NULL) { nRet = SP_OK; gPrintJobsTable[pPrintJob->nIndex] = NULL; HeapFree(GetProcessHeap(), 0, pPrintJob->pszOutput); HeapFree(GetProcessHeap(), 0, pPrintJob->pszTitle); if (pPrintJob->fd >= 0) close(pPrintJob->fd); if (pPrintJob->pid > 0) { pid_t wret; int status; do { wret = waitpid(pPrintJob->pid, &status, 0); } while (wret < 0 && errno == EINTR); if (wret < 0 || !WIFEXITED(status) || WEXITSTATUS(status)) nRet = SP_ERROR; } HeapFree(GetProcessHeap(), 0, pPrintJob); } return nRet; }
/********************************************************************** * CloseJob (GDI.243) * */ INT16 WINAPI CloseJob16(HPJOB16 hJob) { int nRet = SP_ERROR; PPRINTJOB pPrintJob; TRACE("%04x\n", hJob); pPrintJob = FindPrintJobFromHandle(hJob); if (pPrintJob != NULL) { FreePrintJob(hJob); nRet = 1; } return nRet; }
/********************************************************************** * CloseJob (GDI.243) * CloseJob16 (GDI32.@) * */ INT16 WINAPI CloseJob16(HPJOB16 hJob) { int nRet = SP_ERROR; PPRINTJOB pPrintJob = NULL; TRACE("%04x\n", hJob); pPrintJob = FindPrintJobFromHandle(hJob); if (pPrintJob != NULL) { /* Close the spool file */ close(pPrintJob->fd); FreePrintJob(hJob); nRet = 1; } return nRet; }
static int FreePrintJob(HANDLE16 hJob) { int nRet = SP_ERROR; PPRINTJOB pPrintJob; pPrintJob = FindPrintJobFromHandle(hJob); if (pPrintJob != NULL) { gPrintJobsTable[pPrintJob->nIndex] = NULL; HeapFree(GetProcessHeap(), 0, pPrintJob->pszOutput); HeapFree(GetProcessHeap(), 0, pPrintJob->pszTitle); if (pPrintJob->fd >= 0) close(pPrintJob->fd); HeapFree(GetProcessHeap(), 0, pPrintJob); nRet = SP_OK; } return nRet; }