diff options
author | Michael Stahl <mstahl@redhat.com> | 2014-02-18 18:07:37 +0100 |
---|---|---|
committer | Christian Lohmaier <lohmaier+LibreOffice@googlemail.com> | 2014-02-25 14:43:35 +0000 |
commit | b15c48ed0e3db69066ca3b2b40acfb61508dd369 (patch) | |
tree | dd3ef7061d81243672bbc3248207530635d79043 | |
parent | 08c944c5b4b8a0b90a910d75af0ac664dd4fde62 (diff) |
fdo#41524: CUPS printing: use "collate" option when PDF is available
Assume that the CUPS printer is able to handle collating by itself,
don't send multiple print jobs (except if user clicks on "Create single
print jobs for collated output" of course...).
To enable collating with PDF based printers, add the "collate" option;
legacy PS based printers still get the weird stuff read from the PPD
(not sure what the risks of changing that are).
Change-Id: Ia12dc69f9083bba94f2ed633ecbd153aac7e40ab
(cherry picked from commit c76cd71fe9bdefaef3f33f8ca193c32e3ab112ed)
Reviewed-on: https://gerrit.libreoffice.org/8116
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 138f41fd408b120d52e3d6c185940ace065512af)
Reviewed-on: https://gerrit.libreoffice.org/8158
Reviewed-by: Norbert Thiebaud <nthiebaud@gmail.com>
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
-rw-r--r-- | include/vcl/jobdata.hxx | 2 | ||||
-rw-r--r-- | vcl/generic/print/genprnpsp.cxx | 13 | ||||
-rw-r--r-- | vcl/unx/generic/printer/cupsmgr.cxx | 2 | ||||
-rw-r--r-- | vcl/unx/generic/printer/jobdata.cxx | 18 |
4 files changed, 25 insertions, 10 deletions
diff --git a/include/vcl/jobdata.hxx b/include/vcl/jobdata.hxx index 974c04998eef..af78db5aaa86 100644 --- a/include/vcl/jobdata.hxx +++ b/include/vcl/jobdata.hxx @@ -34,6 +34,7 @@ enum type { struct VCL_DLLPUBLIC JobData { int m_nCopies; + bool m_bCollate; int m_nLeftMarginAdjust; int m_nRightMarginAdjust; int m_nTopMarginAdjust; @@ -50,6 +51,7 @@ struct VCL_DLLPUBLIC JobData JobData() : m_nCopies( 1 ), + m_bCollate(false), m_nLeftMarginAdjust( 0 ), m_nRightMarginAdjust( 0 ), m_nTopMarginAdjust( 0 ), diff --git a/vcl/generic/print/genprnpsp.cxx b/vcl/generic/print/genprnpsp.cxx index 1f080a22d196..d19e877315ea 100644 --- a/vcl/generic/print/genprnpsp.cxx +++ b/vcl/generic/print/genprnpsp.cxx @@ -808,16 +808,9 @@ sal_uLong PspSalInfoPrinter::GetCapabilities( const ImplJobSetup* pJobSetup, sal return 0xffff; case PRINTER_CAPABILITIES_COLLATECOPIES: { - // see if the PPD contains a value to set Collate to True - JobData aData; - JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, aData ); - - const PPDKey* pKey = aData.m_pParser ? aData.m_pParser->getKey( OUString("Collate") ) : NULL; - const PPDValue* pVal = pKey ? pKey->getValue(OUString("True")) : NULL; - // PPDs don't mention the number of possible collated copies. // so let's guess as many as we want ? - return pVal ? 0xffff : 0; + return 0xffff; } case PRINTER_CAPABILITIES_SETORIENTATION: return 1; @@ -836,7 +829,7 @@ sal_uLong PspSalInfoPrinter::GetCapabilities( const ImplJobSetup* pJobSetup, sal return 1; else { - // see if the PPD contains a value to set Collate to True + // see if the PPD contains a value to set PDF device JobData aData = PrinterInfoManager::get().getPrinterInfo( pJobSetup->maPrinterName ); if( pJobSetup->mpDriverData ) JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, aData ); @@ -846,7 +839,7 @@ sal_uLong PspSalInfoPrinter::GetCapabilities( const ImplJobSetup* pJobSetup, sal return PrinterInfoManager::get().checkFeatureToken( pJobSetup->maPrinterName, "external_dialog" ) ? 1 : 0; case PRINTER_CAPABILITIES_USEPULLMODEL: { - // see if the PPD contains a value to set Collate to True + // see if the PPD contains a value to set PDF device JobData aData = PrinterInfoManager::get().getPrinterInfo( pJobSetup->maPrinterName ); if( pJobSetup->mpDriverData ) JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, aData ); diff --git a/vcl/unx/generic/printer/cupsmgr.cxx b/vcl/unx/generic/printer/cupsmgr.cxx index 52b6bfbc5509..069df7df581b 100644 --- a/vcl/unx/generic/printer/cupsmgr.cxx +++ b/vcl/unx/generic/printer/cupsmgr.cxx @@ -631,6 +631,8 @@ void CUPSManager::getOptionsFromDocumentSetup( const JobData& rJob, bool bBanner { OString aVal( OString::number( rJob.m_nCopies ) ); rNumOptions = cupsAddOption( "copies", aVal.getStr(), rNumOptions, (cups_option_t**)rOptions ); + aVal = OString::boolean(rJob.m_bCollate); + rNumOptions = cupsAddOption( "collate", aVal.getStr(), rNumOptions, (cups_option_t**)rOptions ); } if( ! bBanner ) { diff --git a/vcl/unx/generic/printer/jobdata.cxx b/vcl/unx/generic/printer/jobdata.cxx index adf9d418bbdf..117f677d6dea 100644 --- a/vcl/unx/generic/printer/jobdata.cxx +++ b/vcl/unx/generic/printer/jobdata.cxx @@ -31,6 +31,7 @@ using namespace psp; JobData& JobData::operator=(const JobData& rRight) { m_nCopies = rRight.m_nCopies; + m_bCollate = rRight.m_bCollate; m_nLeftMarginAdjust = rRight.m_nLeftMarginAdjust; m_nRightMarginAdjust = rRight.m_nRightMarginAdjust; m_nTopMarginAdjust = rRight.m_nTopMarginAdjust; @@ -54,6 +55,11 @@ JobData& JobData::operator=(const JobData& rRight) void JobData::setCollate( bool bCollate ) { + if (m_nPDFDevice > 0) + { + m_bCollate = bCollate; + return; + } const PPDParser* pParser = m_aContext.getParser(); if( pParser ) { @@ -133,6 +139,13 @@ bool JobData::getStreamBuffer( void*& pData, int& bytes ) aLine.append(static_cast<sal_Int32>(m_nCopies)); aStream.WriteLine(aLine.makeStringAndClear()); + if (m_nPDFDevice > 0) + { + aLine.append("collate="); + aLine.append(OString::boolean(m_bCollate)); + aStream.WriteLine(aLine.makeStringAndClear()); + } + aLine.append("margindajustment="); aLine.append(static_cast<sal_Int32>(m_nLeftMarginAdjust)); aLine.append(','); @@ -191,6 +204,7 @@ bool JobData::constructFromStreamBuffer( void* pData, int bytes, JobData& rJobDa const char printerEquals[] = "printer="; const char orientatationEquals[] = "orientation="; const char copiesEquals[] = "copies="; + const char collateEquals[] = "collate="; const char margindajustmentEquals[] = "margindajustment="; const char colordepthEquals[] = "colordepth="; const char colordeviceEquals[] = "colordevice="; @@ -217,6 +231,10 @@ bool JobData::constructFromStreamBuffer( void* pData, int bytes, JobData& rJobDa bCopies = true; rJobData.m_nCopies = aLine.copy(RTL_CONSTASCII_LENGTH(copiesEquals)).toInt32(); } + else if (aLine.startsWith(collateEquals)) + { + rJobData.m_bCollate = aLine.copy(RTL_CONSTASCII_LENGTH(collateEquals)).toInt32(); + } else if (aLine.startsWith(margindajustmentEquals)) { bMargin = true; |