[Libreoffice-commits] core.git: Branch 'libreoffice-4-2-2' - include/vcl vcl/generic vcl/unx

Michael Stahl mstahl at redhat.com
Tue Feb 25 06:43:59 PST 2014


 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 <mstahl at 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 <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    (cherry picked from commit 138f41fd408b120d52e3d6c185940ace065512af)
    Reviewed-on: https://gerrit.libreoffice.org/8158
    Reviewed-by: Norbert Thiebaud <nthiebaud at gmail.com>
    Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice at 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;


More information about the Libreoffice-commits mailing list