bool QPrinter::prepare(PMPrintSettings *s) { if (!psession && PMCreateSession(&psession) != noErr) return FALSE; if (*s == kPMNoPrintSettings) { if (PMCreatePrintSettings(s) != noErr) return FALSE; if (PMSessionDefaultPrintSettings(psession, *s) != noErr) return FALSE; } else { if (PMSessionValidatePrintSettings(psession, *s, kPMDontWantBoolean) != noErr) return FALSE; } if (minPage() != 0 || maxPage() != 0) PMSetPageRange(*s, minPage(), maxPage()); if (d->printRange != AllPages) { PMSetFirstPage(*s, fromPage(), TRUE); PMSetLastPage(*s, toPage(), TRUE); } PMSetColorMode(*s, colorMode() == GrayScale ? kPMGray : kPMColor); PMSetCopies(*s, numCopies(), TRUE); if (outputToFile()) { CFStringRef cfstring = qstring2cfstring(outputFileName()); CFURLRef outFile = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, cfstring, kCFURLPOSIXPathStyle, false); PMSessionSetDestination(psession, *s, kPMDestinationFile, kPMDocumentFormatPDF, outFile); CFRelease(outFile); CFRelease(cfstring); } QString printName = printerName(); if (!printName.isEmpty()) { CFStringRef pname = qstring2cfstring(printName); PMSessionSetCurrentPrinter(psession, pname); CFRelease(pname); } return TRUE; }
int QPrintDialog::exec() { Q_D(QPrintDialog); QMacBlockingFunction func; Boolean result; // If someone is reusing a QPrinter object, the end released all our old // information. In this case, we must reinitialize. if (d->ep->session == 0) d->ep->initialize(); // Carbon's documentation lies. // It seems the only way that Carbon lets you use all is if the minimum // for the page range is 1. This _kind of_ makes sense if you think about // it. However, calling _q_setFirstPage or _q_setLastPage always enforces the range. PMSetPageRange(d->ep->settings, minPage(), maxPage()); if (printRange() == PageRange) { PMSetFirstPage(d->ep->settings, fromPage(), false); PMSetLastPage(d->ep->settings, toPage(), false); } { //simulate modality QWidget modal_widg(0, Qt::Window); modal_widg.setObjectName(QLatin1String(__FILE__ "__modal_dlg")); QApplicationPrivate::enterModal(&modal_widg); PMSessionPrintDialog(d->ep->session, d->ep->settings, d->ep->format, &result); QApplicationPrivate::leaveModal(&modal_widg); } if (result) { UInt32 frompage, topage; PMGetFirstPage(d->ep->settings, &frompage); PMGetLastPage(d->ep->settings, &topage); topage = qMin(UInt32(INT_MAX), topage); setFromTo(frompage, topage); // OK, I need to map these values back let's see // If from is 1 and to is INT_MAX, then print it all // (Apologies to the folks with more than INT_MAX pages) // ...that's a joke. if (fromPage() == 1 && toPage() == INT_MAX) { setPrintRange(AllPages); setFromTo(0,0); } else { setPrintRange(PageRange); // In a way a lie, but it shouldn't hurt. // Carbon hands us back a very large number here even for ALL, set it to max // in that case to follow the behavior of the other print dialogs. if (maxPage() < toPage()) setFromTo(fromPage(), maxPage()); } // Keep us in sync with file output PMDestinationType dest; PMSessionGetDestinationType(d->ep->session, d->ep->settings, &dest); if (dest == kPMDestinationFile) { QCFType<CFURLRef> file; PMSessionCopyDestinationLocation(d->ep->session, d->ep->settings, &file); UInt8 localFile[2048]; // Assuming there's a POSIX file system here. CFURLGetFileSystemRepresentation(file, true, localFile, sizeof(localFile)); d->ep->outputFilename = QString::fromUtf8(reinterpret_cast<const char *>(localFile)); } } return result; }