static int is_printer(const char *name) { /* is printer if no name given */ if (strlen(name) == 0) return TRUE; /* is printer if name prefixed by \\spool\ */ if (is_spool(name)) return TRUE; return FALSE; }
/* Print File */ static int gp_printfile(const char *filename, const char *pmport) { if (strlen(pmport) == 0) { /* get default printer */ char buf[256]; char *p; /* WinNT stores default printer in registry and win.ini */ /* Win95 stores default printer in win.ini */ GetProfileString("windows", "device", "", buf, sizeof(buf)); if ((p = strchr(buf, ',')) != NULL) *p = '\0'; return gp_printfile_win32(filename, buf); } else if (is_spool(pmport)) { if (strlen(pmport) >= 8) return gp_printfile_win32(filename, (char *)pmport + 8); else return gp_printfile_win32(filename, (char *)NULL); } else return gs_error_undefinedfilename; }
/* Get Device Context for printer */ static int win_pr2_getdc(gx_device_win_pr2 * wdev) { char *device; char *devices; char *p; char driverbuf[512]; char *driver; char *output; char *devcap; int devcapsize; int devmode_size; int i, n; POINT *pp; int paperindex; int paperwidth, paperheight; int orientation; int papersize; char papername[64]; LPDEVMODE podevmode, pidevmode; HANDLE hprinter; /* first try to derive the printer name from -sOutputFile= */ /* is printer if name prefixed by \\spool\ or by %printer% */ if (is_spool(wdev->fname)) { device = wdev->fname + 8; /* skip over \\spool\ */ wdev->use_old_spool_name = true; } else if (strncmp("%printer%",wdev->fname,9) == 0) { device = wdev->fname + 9; /* skip over %printer% */ wdev->use_old_spool_name = false; } else { return FALSE; } /* now try to match the printer name against the [Devices] section */ if ((devices = gs_malloc(wdev->memory, 4096, 1, "win_pr2_getdc")) == (char *)NULL) return FALSE; GetProfileString("Devices", NULL, "", devices, 4096); p = devices; while (*p) { if (stricmp(p, device) == 0) break; p += strlen(p) + 1; } if (*p == '\0') p = NULL; gs_free(wdev->memory, devices, 4096, 1, "win_pr2_getdc"); if (p == NULL) return FALSE; /* doesn't match an available printer */ /* the printer exists, get the remaining information from win.ini */ GetProfileString("Devices", device, "", driverbuf, sizeof(driverbuf)); driver = strtok(driverbuf, ","); output = strtok(NULL, ","); if (!OpenPrinter(device, &hprinter, NULL)) return FALSE; devmode_size = DocumentProperties(NULL, hprinter, device, NULL, NULL, 0); if ((podevmode = gs_malloc(wdev->memory, devmode_size, 1, "win_pr2_getdc")) == (LPDEVMODE) NULL) { ClosePrinter(hprinter); return FALSE; } if ((pidevmode = gs_malloc(wdev->memory, devmode_size, 1, "win_pr2_getdc")) == (LPDEVMODE) NULL) { gs_free(wdev->memory, podevmode, devmode_size, 1, "win_pr2_getdc"); ClosePrinter(hprinter); return FALSE; } DocumentProperties(NULL, hprinter, device, podevmode, NULL, DM_OUT_BUFFER); /* now find out what paper sizes are available */ devcapsize = DeviceCapabilities(device, output, DC_PAPERSIZE, NULL, NULL); devcapsize *= sizeof(POINT); if ((devcap = gs_malloc(wdev->memory, devcapsize, 1, "win_pr2_getdc")) == (LPBYTE) NULL) return FALSE; n = DeviceCapabilities(device, output, DC_PAPERSIZE, devcap, NULL); paperwidth = (int)(wdev->MediaSize[0] * 254 / 72); paperheight = (int)(wdev->MediaSize[1] * 254 / 72); papername[0] = '\0'; papersize = 0; paperindex = -1; orientation = 0; pp = (POINT *) devcap; for (i = 0; i < n; i++, pp++) { if ((pp->x < paperwidth + 20) && (pp->x > paperwidth - 20) && (pp->y < paperheight + 20) && (pp->y > paperheight - 20)) { paperindex = i; paperwidth = pp->x; paperheight = pp->y; orientation = DMORIENT_PORTRAIT; break; } } if (paperindex < 0) { /* try again in landscape */ pp = (POINT *) devcap; for (i = 0; i < n; i++, pp++) { if ((pp->x < paperheight + 20) && (pp->x > paperheight - 20) && (pp->y < paperwidth + 20) && (pp->y > paperwidth - 20)) { paperindex = i; paperwidth = pp->x; paperheight = pp->y; orientation = DMORIENT_LANDSCAPE; break; } } } gs_free(wdev->memory, devcap, devcapsize, 1, "win_pr2_getdc"); /* get the dmPaperSize */ devcapsize = DeviceCapabilities(device, output, DC_PAPERS, NULL, NULL); devcapsize *= sizeof(WORD); if ((devcap = gs_malloc(wdev->memory, devcapsize, 1, "win_pr2_getdc")) == (LPBYTE) NULL) return FALSE; n = DeviceCapabilities(device, output, DC_PAPERS, devcap, NULL); if ((paperindex >= 0) && (paperindex < n)) papersize = ((WORD *) devcap)[paperindex]; gs_free(wdev->memory, devcap, devcapsize, 1, "win_pr2_getdc"); /* get the paper name */ devcapsize = DeviceCapabilities(device, output, DC_PAPERNAMES, NULL, NULL); devcapsize *= 64; if ((devcap = gs_malloc(wdev->memory, devcapsize, 1, "win_pr2_getdc")) == (LPBYTE) NULL) return FALSE; n = DeviceCapabilities(device, output, DC_PAPERNAMES, devcap, NULL); if ((paperindex >= 0) && (paperindex < n)) strcpy(papername, devcap + paperindex * 64); gs_free(wdev->memory, devcap, devcapsize, 1, "win_pr2_getdc"); memcpy(pidevmode, podevmode, devmode_size); pidevmode->dmFields = 0; wdev->paper_name[0] = 0; if ( (wdev->user_paper) && (wdev->user_paper != papersize) ) { papersize = wdev->user_paper; paperheight = 0; paperwidth = 0; papername[0] = 0; } if (wdev->user_orient) { orientation = wdev->user_orient; } pidevmode->dmFields &= ~(DM_PAPERSIZE | DM_ORIENTATION | DM_COLOR | DM_PAPERLENGTH | DM_PAPERWIDTH | DM_DUPLEX); pidevmode->dmFields |= DM_DEFAULTSOURCE; pidevmode->dmDefaultSource = 0; if (orientation) { wdev->user_orient = orientation; } if (papersize) { wdev->user_paper = papersize; strcpy (wdev->paper_name, papername); } if (paperheight && paperwidth) { pidevmode->dmFields |= (DM_PAPERLENGTH | DM_PAPERWIDTH); pidevmode->dmPaperWidth = paperwidth; pidevmode->dmPaperLength = paperheight; wdev->user_media_size[0] = paperwidth / 254.0 * 72.0; wdev->user_media_size[1] = paperheight / 254.0 * 72.0; } if (DeviceCapabilities(device, output, DC_DUPLEX, NULL, NULL)) { wdev->Duplex_set = 1; } win_pr2_update_win(wdev, pidevmode); /* merge the entries */ DocumentProperties(NULL, hprinter, device, podevmode, pidevmode, DM_IN_BUFFER | DM_OUT_BUFFER); ClosePrinter(hprinter); /* now get a DC */ wdev->hdcprn = CreateDC(driver, device, NULL, podevmode); if (wdev->win32_hdevmode == NULL) wdev->win32_hdevmode = GlobalAlloc(0, devmode_size); if (wdev->win32_hdevmode) { LPDEVMODE pdevmode = (LPDEVMODE) GlobalLock(wdev->win32_hdevmode); if (pdevmode) { memcpy(pdevmode, podevmode, devmode_size); GlobalUnlock(wdev->win32_hdevmode); } } gs_free(wdev->memory, pidevmode, devmode_size, 1, "win_pr2_getdc"); gs_free(wdev->memory, podevmode, devmode_size, 1, "win_pr2_getdc"); if (wdev->hdcprn != (HDC) NULL) return TRUE; /* success */ /* fall back to prompting user */ return FALSE; }