include/vcl/jobdata.hxx | 2 ++ vcl/generic/print/genprnpsp.cxx | 13 +++---------- vcl/unx/generic/printer/cupsmgr.cxx | 2 ++ vcl/unx/generic/printer/jobdata.cxx | 18 ++++++++++++++++++ 4 files changed, 25 insertions(+), 10 deletions(-)
New commits: commit b15c48ed0e3db69066ca3b2b40acfb61508dd369 Author: Michael Stahl <mst...@redhat.com> Date: Tue Feb 18 18:07:37 2014 +0100 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 <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> (cherry picked from commit 138f41fd408b120d52e3d6c185940ace065512af) Reviewed-on: https://gerrit.libreoffice.org/8158 Reviewed-by: Norbert Thiebaud <nthieb...@gmail.com> Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/include/vcl/jobdata.hxx b/include/vcl/jobdata.hxx index 974c049..af78db5 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 1f080a2..d19e877 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 52b6bfb..069df7d 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 adf9d41..117f677 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;
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits