static int os2_printer_fopen(gx_io_device * iodev, const char *fname, const char *access, FILE ** pfile, char *rfname, uint rnamelen) { os2_printer_t *pr = (os2_printer_t *)iodev->state; char driver_name[256]; /* Make sure that printer exists. */ if (pm_find_queue(pr->memory, fname, driver_name)) { /* error, list valid queue names */ emprintf(pr->memory, "Invalid queue name. Use one of:\n"); pm_find_queue(pr->memory, NULL, NULL); return_error(gs_error_undefinedfilename); } strncpy(pr->queue, fname, sizeof(pr->queue)-1); /* Create a temporary file */ *pfile = gp_open_scratch_file(pr->memory, "gs", pr->filename, access); if (*pfile == NULL) return_error(gs_fopen_errno_to_code(errno)); return 0; }
/* if filename is NULL, return 0 if spool queue is valid, non-zero if error */ int pm_spool(char *filename, const char *queue) { HSPL hspl; PDEVOPENSTRUC pdata; PSZ pszToken = "*"; ULONG jobid; BOOL rc; char queue_name[256]; char driver_name[256]; char *buffer; FILE *f; int count; if (strlen(queue) != 0) { /* queue specified */ strcpy(queue_name, queue + 8); /* skip over \\spool\ */ } else { /* get default queue */ queue_name[0] = '\0'; } if (pm_find_queue(queue_name, driver_name)) { /* error, list valid queue names */ eprintf("Invalid queue name. Use one of:\n"); pm_find_queue(NULL, NULL); return 1; } if (!filename) return 0; /* we were only asked to check the queue */ if ((buffer = malloc(PRINT_BUF_SIZE)) == (char *)NULL) { eprintf("Out of memory in pm_spool\n"); return 1; } if ((f = fopen(filename, "rb")) == (FILE *) NULL) { free(buffer); eprintf1("Can't open temporary file %s\n", filename); return 1; } /* Allocate memory for pdata */ if (!DosAllocMem((PVOID) & pdata, sizeof(DEVOPENSTRUC), (PAG_READ | PAG_WRITE | PAG_COMMIT))) { /* Initialize elements of pdata */ pdata->pszLogAddress = queue_name; pdata->pszDriverName = driver_name; pdata->pdriv = NULL; pdata->pszDataType = "PM_Q_RAW"; pdata->pszComment = "Ghostscript"; pdata->pszQueueProcName = NULL; pdata->pszQueueProcParams = NULL; pdata->pszSpoolerParams = NULL; pdata->pszNetworkParams = NULL; hspl = SplQmOpen(pszToken, 4L, (PQMOPENDATA) pdata); if (hspl == SPL_ERROR) { eprintf("SplQmOpen failed.\n"); DosFreeMem((PVOID) pdata); free(buffer); fclose(f); return 1; /* failed */ } rc = SplQmStartDoc(hspl, "Ghostscript"); if (!rc) { eprintf("SplQmStartDoc failed.\n"); DosFreeMem((PVOID) pdata); free(buffer); fclose(f); return 1; } /* loop, copying file to queue */ while (rc && (count = fread(buffer, 1, PRINT_BUF_SIZE, f)) != 0) { rc = SplQmWrite(hspl, count, buffer); if (!rc) eprintf("SplQmWrite failed.\n"); } free(buffer); fclose(f); if (!rc) { eprintf("Aborting Spooling.\n"); SplQmAbort(hspl); } else { SplQmEndDoc(hspl); rc = SplQmClose(hspl); if (!rc) eprintf("SplQmClose failed.\n"); } } else rc = 0; /* no memory */ return !rc; }