From 2c973bd1fc471aedcb0a3609b9534a0434bb9c02 Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Sat, 27 Mar 2004 07:08:38 +0000 Subject: [PATCH] Implemented copy number of pages for printers that do not support page copy command. Check if PrintToFile dialog was canceled and return without an error. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7072 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/print/libprint/PrinterCap.h | 5 +- headers/private/print/libprint/Transport.h | 1 + .../shared/libprint/GraphicsDriver.cpp | 54 ++++++++++++------- .../drivers/shared/libprint/Transport.cpp | 9 ++++ 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/headers/private/print/libprint/PrinterCap.h b/headers/private/print/libprint/PrinterCap.h index a8733abd94..b2ca00b11c 100644 --- a/headers/private/print/libprint/PrinterCap.h +++ b/headers/private/print/libprint/PrinterCap.h @@ -88,7 +88,10 @@ public: kOrientation, kPrintStyle, kBindingLocation, - kColor + kColor, + // Static boolean settings follow. + // For them isSupport() has to be implemented only. + kCopyCommand // supports printer page copy command? }; virtual int countCap(CapID) const = 0; diff --git a/headers/private/print/libprint/Transport.h b/headers/private/print/libprint/Transport.h index 5ae522ccd9..222d77ccf2 100644 --- a/headers/private/print/libprint/Transport.h +++ b/headers/private/print/libprint/Transport.h @@ -37,6 +37,7 @@ public: ~Transport(); void write(const void *buffer, size_t size) throw(TransportException); bool check_abort() const; + bool is_print_to_file_canceled() const; const string &last_error() const; protected: diff --git a/src/add-ons/print/drivers/shared/libprint/GraphicsDriver.cpp b/src/add-ons/print/drivers/shared/libprint/GraphicsDriver.cpp index fb2253b50d..4529ab90af 100644 --- a/src/add-ons/print/drivers/shared/libprint/GraphicsDriver.cpp +++ b/src/add-ons/print/drivers/shared/libprint/GraphicsDriver.cpp @@ -421,31 +421,45 @@ bool GraphicsDriver::printDocument(SpoolData *spool_data) PageData *page_data; int page_index; int nup; + int copy; + int copies; - more = false; + more = true; success = true; page_index = 0; - + if (fPrinterCap->isSupport(PrinterCap::kCopyCommand)) { + copies = 1; + } else { + copies = fRealJobData->getCopies(); + } if (spool_data->startEnum()) { + nup = fOrgJobData->getNup(); do { DBGMSG(("page index = %d\n", page_index)); - if (!(success = startPage(page_index))) - break; - nup = fOrgJobData->getNup(); + PageDataList pages; do { more = spool_data->enumObject(&page_data); pages.push_back(page_data); } while (more && --nup); - fView->Window()->Lock(); - success = printPage(&pages); - fView->Window()->Unlock(); - if (!success) - break; - if (!(success = endPage(page_index))) - break; + + // print each physical page "copies" of times + for (copy = 0; success && copy < copies; copy ++) { + success = startPage(page_index); + if (!success) + break; + + fView->Window()->Lock(); + success = printPage(&pages); + fView->Window()->Unlock(); + + if (success) { + success = endPage(page_index); + } + } + page_index++; - } while (more); + } while (success && more); } #ifndef USE_PREVIEW_FOR_DEBUG @@ -454,12 +468,12 @@ bool GraphicsDriver::printDocument(SpoolData *spool_data) && (fOrgJobData->getPrintStyle() != JobData::kSimplex) && (((page_index + fOrgJobData->getNup() - 1) / fOrgJobData->getNup()) % 2)) { - success = startPage(page_index); - if (success) { - success = printPage(NULL); - if (success) { - success = endPage(page_index); - } + // print each physical page "copies" of times + for (copy = 0; success && copy < copies; copy ++) { + success = + startPage(page_index) && + printPage(NULL) && + endPage(page_index); } } #endif @@ -487,7 +501,7 @@ bool GraphicsDriver::printJob(BFile *spool_file) if (fTransport->check_abort()) { success = false; - } else { + } else if (!fTransport->is_print_to_file_canceled()) { setupData(spool_file, pfh.page_count); setupBitmap(); SpoolData spool_data(spool_file, pfh.page_count, fOrgJobData->getNup(), fOrgJobData->getReverse()); diff --git a/src/add-ons/print/drivers/shared/libprint/Transport.cpp b/src/add-ons/print/drivers/shared/libprint/Transport.cpp index fd99de8ac3..620ce9980d 100644 --- a/src/add-ons/print/drivers/shared/libprint/Transport.cpp +++ b/src/add-ons/print/drivers/shared/libprint/Transport.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -93,6 +94,14 @@ const string &Transport::last_error() const return fLastErrorString; } +bool Transport::is_print_to_file_canceled() const +{ + // The BeOS "Print To File" transport add-on returns a non-NULL BDataIO * + // even after user filepanel cancellation! + BFile* file = dynamic_cast(fDataStream); + return file != NULL && file->InitCheck() != B_OK; +} + void Transport::set_last_error(const char *e) { fLastErrorString = e;