summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-02-18 18:07:37 +0100
committerMichael Stahl <mstahl@redhat.com>2014-02-18 22:56:51 +0100
commitc76cd71fe9bdefaef3f33f8ca193c32e3ab112ed (patch)
tree8d9b0e2e637a0df6c37321af63b05a2844b9a317
parent6058a238fceba2e856e0f52c0438a480cb7cb59f (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
-rw-r--r--include/vcl/jobdata.hxx2
-rw-r--r--vcl/generic/print/genprnpsp.cxx13
-rw-r--r--vcl/unx/generic/printer/cupsmgr.cxx2
-rw-r--r--vcl/unx/generic/printer/jobdata.cxx18
4 files changed, 25 insertions, 10 deletions
diff --git a/include/vcl/jobdata.hxx b/include/vcl/jobdata.hxx
index 22ef0ee48014..8cffdd1c234c 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 bf38ef0fe8b3..fca730d4ad4a 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 75c45ab12096..2cfcbaab5ec1 100644
--- a/vcl/unx/generic/printer/cupsmgr.cxx
+++ b/vcl/unx/generic/printer/cupsmgr.cxx
@@ -603,6 +603,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 9b9e9eca2aa1..f9a9d3f2c674 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;