summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2016-01-19 14:05:37 +0100
committerJan-Marek Glogowski <glogow@fbihome.de>2016-03-24 22:40:37 +0100
commitdea0abc58c558d3c62e806d06035b1a30420264e (patch)
treee6f5be01ca0d6e922e8fc1d243ac5645e54f2ce4
parent4ba9bf6ad0e7383e0af421a5fea79e3b9d34fce6 (diff)
tdf#93236 Revert "support fast MM printing in...
non-single-file mode only for CUPS" This reverts commit 138d29aa09417eba4d15ade4c9f4dab2620b6326. The patch breaks all print opions affecting multiple pages, i.e. page range selection, pages per sheet, blank pages, reverse page order and copies. Conflicts: configure.ac sw/source/uibase/dbui/dbmgr.cxx vcl/inc/cupsmgr.hxx vcl/unx/generic/printer/cupsmgr.cxx Change-Id: I8c39e7f0e71ef9688254c0a0dba049e1836b733c
-rw-r--r--config_host/config_cups.h.in6
-rw-r--r--configure.ac3
-rw-r--r--include/vcl/jobdata.hxx6
-rw-r--r--include/vcl/printerinfomanager.hxx10
-rw-r--r--sw/source/uibase/dbui/dbmgr.cxx40
-rw-r--r--vcl/inc/unx/cupsmgr.hxx24
-rw-r--r--vcl/unx/generic/printer/cupsmgr.cxx105
-rw-r--r--vcl/unx/generic/printer/jobdata.cxx18
-rw-r--r--vcl/unx/generic/printer/printerinfomanager.cxx15
9 files changed, 20 insertions, 207 deletions
diff --git a/config_host/config_cups.h.in b/config_host/config_cups.h.in
deleted file mode 100644
index 6794703664d9..000000000000
--- a/config_host/config_cups.h.in
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef CONFIG_CUPS_H
-#define CONFIG_CUPS_H
-
-#define ENABLE_CUPS 0
-
-#endif
diff --git a/configure.ac b/configure.ac
index 6e455d57d492..c81bd1aae570 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4850,7 +4850,7 @@ if test "$test_cups" = "yes"; then
if test "$ac_cv_lib_cups_cupsPrintFiles" != "yes" -o "$ac_cv_header_cups_cups_h" != "yes"; then
AC_MSG_ERROR([Could not find CUPS. Install libcups2-dev or cups-devel.])
fi
- AC_DEFINE(ENABLE_CUPS)
+
else
AC_MSG_RESULT([no])
fi
@@ -12967,7 +12967,6 @@ AC_CONFIG_HEADERS([config_host/config_dconf.h])
AC_CONFIG_HEADERS([config_host/config_eot.h])
AC_CONFIG_HEADERS([config_host/config_extension_update.h])
AC_CONFIG_HEADERS([config_host/config_cairo_canvas.h])
-AC_CONFIG_HEADERS([config_host/config_cups.h])
AC_CONFIG_HEADERS([config_host/config_cxxabi.h])
AC_CONFIG_HEADERS([config_host/config_dbus.h])
AC_CONFIG_HEADERS([config_host/config_features.h])
diff --git a/include/vcl/jobdata.hxx b/include/vcl/jobdata.hxx
index 771f73c314ea..13b34de93320 100644
--- a/include/vcl/jobdata.hxx
+++ b/include/vcl/jobdata.hxx
@@ -79,12 +79,6 @@ struct VCL_DLLPUBLIC JobData
static bool constructFromStreamBuffer( void* pData, sal_uInt32 bytes, JobData& rJobData );
};
-bool operator==(const psp::JobData& rLeft, const psp::JobData& rRight);
-inline bool operator!=(const psp::JobData& rLeft, const psp::JobData& rRight)
-{
- return !( rLeft == rRight );
-}
-
} // namespace
diff --git a/include/vcl/printerinfomanager.hxx b/include/vcl/printerinfomanager.hxx
index d41a7c8bc270..f548bf239e91 100644
--- a/include/vcl/printerinfomanager.hxx
+++ b/include/vcl/printerinfomanager.hxx
@@ -195,16 +195,6 @@ public:
// check whether a printer's feature string contains a subfeature
bool checkFeatureToken( const OUString& rPrinterName, const char* pToken ) const;
- // Starts printing in a batch mode, in which all printing will be done together instead of separate jobs.
- // If the implementation supports it, calls to endSpool() will only delay the printing until flushBatchPrint()
- // is called to print all delayed jobs.
- // Returns false if failed or not supported (in which case endSpool() will print normally).
- virtual bool startBatchPrint();
- // Actually spools all delayed print jobs, if enabled, and disables batch mode.
- virtual bool flushBatchPrint();
- // Returns true batch printing is supported at all.
- virtual bool supportsBatchPrint() const;
-
virtual ~PrinterInfoManager();
};
diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx
index 0c26cb120d2a..2eb6b4336893 100644
--- a/sw/source/uibase/dbui/dbmgr.cxx
+++ b/sw/source/uibase/dbui/dbmgr.cxx
@@ -137,10 +137,6 @@
#include <dbfld.hxx>
#include <memory>
-#include <config_cups.h>
-#if ENABLE_CUPS && !defined(MACOSX)
-#include <vcl/printerinfomanager.hxx>
-#endif
#include <comphelper/propertysequence.hxx>
#include <officecfg/Office/Common.hxx>
@@ -910,27 +906,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
bool bNoError = true;
const bool bEMail = rMergeDescriptor.nMergeType == DBMGR_MERGE_EMAIL;
const bool bMergeShell = rMergeDescriptor.nMergeType == DBMGR_MERGE_SHELL;
- bool bCreateSingleFile = rMergeDescriptor.bCreateSingleFile;
-
- if( rMergeDescriptor.nMergeType == DBMGR_MERGE_PRINTER )
- {
- // It is possible to do MM printing in both modes for the same result, but the singlefile mode
- // is slower because of all the temporary document copies and merging them together
- // into the single file, while the other mode simply updates fields and prints for every record.
- // However, this would cause one print job for every record, and e.g. CUPS refuses new jobs
- // if it has many jobs enqueued (500 by default), and with the current printing framework
- // (which uses a pull model) it's rather complicated to create a single print job
- // in steps.
- // To handle this, CUPS backend has been changed to cache all the documents to print
- // and send them to CUPS only as one job at the very end. Therefore, with CUPS, it's ok
- // to use the faster mode. As I have no idea about other platforms, keep them using
- // the slower singlefile mode (or feel free to check them, or rewrite the printing code).
-#if ENABLE_CUPS && !defined(MACOSX)
- bCreateSingleFile = !psp::PrinterInfoManager::get().supportsBatchPrint();
-#else
- bCreateSingleFile = true;
-#endif
- }
+ const bool bCreateSingleFile = rMergeDescriptor.bCreateSingleFile;
::rtl::Reference< MailDispatcher > xMailDispatcher;
OUString sBodyMimeType;
@@ -1342,13 +1318,10 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
}
}
pWorkView->StartPrint( aOptions, IsMergeSilent(), rMergeDescriptor.bPrintAsync );
- SfxPrinter* pDocPrt = pWorkView->GetPrinter();
- JobSetup aJobSetup = pDocPrt ? pDocPrt->GetJobSetup() : SfxViewShell::GetJobSetup();
+ // some GetPrinter functions have a true default, so keep the false
+ SfxPrinter* pDocPrt = pWorkView->GetPrinter( false );
+ JobSetup aJobSetup = pDocPrt ? pDocPrt->GetJobSetup() : pWorkView->GetJobSetup();
bCancel = !Printer::PreparePrintJob( pWorkView->GetPrinterController(), aJobSetup );
-#if ENABLE_CUPS && !defined(MACOSX)
- if( !bCancel )
- psp::PrinterInfoManager::get().startBatchPrint();
-#endif
}
if( !bCancel && !Printer::ExecutePrintJob( pWorkView->GetPrinterController()))
bCancel = true;
@@ -1491,12 +1464,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
if( !bCreateSingleFile )
{
if( rMergeDescriptor.nMergeType == DBMGR_MERGE_PRINTER )
- {
Printer::FinishPrintJob( pWorkView->GetPrinterController());
-#if ENABLE_CUPS && !defined(MACOSX)
- psp::PrinterInfoManager::get().flushBatchPrint();
-#endif
- }
if( !bIsPDFexport )
{
pWorkDoc->SetDBManager( pOldDBManager );
diff --git a/vcl/inc/unx/cupsmgr.hxx b/vcl/inc/unx/cupsmgr.hxx
index e7860e2f8f5c..576afd4fe3cc 100644
--- a/vcl/inc/unx/cupsmgr.hxx
+++ b/vcl/inc/unx/cupsmgr.hxx
@@ -58,23 +58,6 @@ class CUPSManager : public PrinterInfoManager
osl::Mutex m_aGetPPDMutex;
bool m_bPPDThreadRunning;
- struct PendingJob
- {
- OUString printerName;
- OUString jobTitle;
- JobData jobData;
- bool banner;
- OUString faxNumber;
- OString file;
- PendingJob( const OUString& printerName_, const OUString& jobTitle_, const JobData& jobData_,
- bool banner_, const OUString& faxNumber_, const OString& file_ )
- : printerName( printerName_ ), jobTitle( jobTitle_ ), jobData( jobData_ ), banner( banner_ ), faxNumber( faxNumber_ ), file( file_ )
- {}
- PendingJob() : banner( false ) {}
- };
- std::list< PendingJob > pendingJobs;
- bool batchMode;
-
CUPSManager();
virtual ~CUPSManager();
@@ -83,9 +66,6 @@ class CUPSManager : public PrinterInfoManager
static void getOptionsFromDocumentSetup( const JobData& rJob, bool bBanner, int& rNumOptions, void** rOptions );
void runDests();
OString threadedCupsGetPPD(const char* pPrinter);
-
- bool processPendingJobs();
- bool printJobs( const PendingJob& job, const std::vector< OString >& files );
public:
static void runDestThread(void* pMgr);
@@ -100,10 +80,6 @@ public:
virtual bool endSpool( const OUString& rPrinterName, const OUString& rJobTitle, FILE* pFile, const JobData& rDocumentJobData, bool bBanner, const OUString& rFaxNumber ) override;
virtual void setupJobContextData( JobData& rData ) override;
- virtual bool startBatchPrint() override;
- virtual bool flushBatchPrint() override;
- virtual bool supportsBatchPrint() const override;
-
/// changes the info about a named printer
virtual void changePrinterInfo( const OUString& rPrinter, const PrinterInfo& rNewInfo ) override;
diff --git a/vcl/unx/generic/printer/cupsmgr.cxx b/vcl/unx/generic/printer/cupsmgr.cxx
index 71464d7e9157..2da3bf90e4fc 100644
--- a/vcl/unx/generic/printer/cupsmgr.cxx
+++ b/vcl/unx/generic/printer/cupsmgr.cxx
@@ -183,8 +183,7 @@ CUPSManager::CUPSManager() :
m_nDests( 0 ),
m_pDests( nullptr ),
m_bNewDests( false ),
- m_bPPDThreadRunning( false ),
- batchMode( false )
+ m_bPPDThreadRunning( false )
{
m_aDestThread = osl_createThread( run_dest_thread_stub, this );
}
@@ -626,6 +625,8 @@ bool CUPSManager::endSpool( const OUString& rPrintername, const OUString& rJobTi
rDocumentJobData.m_nCopies
);
+ int nJobID = 0;
+
osl::MutexGuard aGuard( m_aCUPSMutex );
std::unordered_map< OUString, int, OUStringHash >::iterator dest_it =
@@ -637,106 +638,32 @@ bool CUPSManager::endSpool( const OUString& rPrintername, const OUString& rJobTi
}
std::unordered_map< FILE*, OString, FPtrHash >::const_iterator it = m_aSpoolFiles.find( pFile );
- if( it == m_aSpoolFiles.end() )
- return false;
- fclose( pFile );
- PendingJob job( rPrintername, rJobTitle, rDocumentJobData, bBanner, rFaxNumber, it->second );
- m_aSpoolFiles.erase( pFile );
- pendingJobs.push_back( job );
- if( !batchMode ) // process immediately, otherwise will be handled by flushBatchPrint()
- return processPendingJobs();
- return true;
-}
-
-bool CUPSManager::startBatchPrint()
-{
- batchMode = true;
- return true;
-}
-
-bool CUPSManager::supportsBatchPrint() const
-{
- return true;
-}
-
-bool CUPSManager::flushBatchPrint()
-{
- osl::MutexGuard aGuard( m_aCUPSMutex );
- batchMode = false; // reset the batch print mode
- return processPendingJobs();
-}
-
-bool CUPSManager::processPendingJobs()
-{
- // Print all jobs that have the same data using one CUPS call (i.e. merge all jobs that differ only in files to print).
- PendingJob currentJobData;
- bool first = true;
- std::vector< OString > files;
- bool ok = true;
- while( !pendingJobs.empty())
- {
- if( first )
- {
- currentJobData = pendingJobs.front();
- first = false;
- }
- else if( currentJobData.printerName != pendingJobs.front().printerName
- || currentJobData.jobTitle != pendingJobs.front().jobTitle
- || currentJobData.jobData != pendingJobs.front().jobData
- || currentJobData.banner != pendingJobs.front().banner )
- {
- if( !printJobs( currentJobData, files ))
- ok = false;
- files.clear();
- currentJobData = pendingJobs.front();
- }
- files.push_back( pendingJobs.front().file );
- pendingJobs.pop_front();
- }
- if( !first )
+ if( it != m_aSpoolFiles.end() )
{
- if( !printJobs( currentJobData, files )) // print the last batch
- ok = false;
- }
- return ok;
-}
-
-bool CUPSManager::printJobs( const PendingJob& job, const std::vector< OString >& files )
-{
- std::unordered_map< OUString, int, OUStringHash >::iterator dest_it =
- m_aCUPSDestMap.find( job.printerName );
-
+ fclose( pFile );
rtl_TextEncoding aEnc = osl_getThreadTextEncoding();
// setup cups options
int nNumOptions = 0;
cups_option_t* pOptions = nullptr;
- getOptionsFromDocumentSetup( job.jobData, job.banner, nNumOptions, reinterpret_cast<void**>(&pOptions) );
+ getOptionsFromDocumentSetup( rDocumentJobData, bBanner, nNumOptions, reinterpret_cast<void**>(&pOptions) );
- OString sJobName(OUStringToOString(job.jobTitle, aEnc));
+ OString sJobName(OUStringToOString(rJobTitle, aEnc));
//fax4CUPS, "the job name will be dialled for you"
//so override the jobname with the desired number
- if (!job.faxNumber.isEmpty())
+ if (!rFaxNumber.isEmpty())
{
- sJobName = OUStringToOString(job.faxNumber, aEnc);
+ sJobName = OUStringToOString(rFaxNumber, aEnc);
}
cups_dest_t* pDest = static_cast<cups_dest_t*>(m_pDests) + dest_it->second;
-
- std::vector< const char* > fnames;
- for( std::vector< OString >::const_iterator it = files.begin();
- it != files.end();
- ++it )
- fnames.push_back( it->getStr());
-
- int nJobID = cupsPrintFiles(pDest->name,
- fnames.size(),
- fnames.data(),
+ nJobID = cupsPrintFile(pDest->name,
+ it->second.getStr(),
sJobName.getStr(),
nNumOptions, pOptions);
SAL_INFO("vcl.unx.print", "cupsPrintFile( " << pDest->name << ", "
- << ( fnames.size() == 1 ? files.front() : OString::number( fnames.size()) ).getStr() << ", " << sJobName << ", " << nNumOptions
+ << it->second << ", " << rJobTitle << ", " << nNumOptions
<< ", " << pOptions << " ) returns " << nJobID);
for( int n = 0; n < nNumOptions; n++ )
SAL_INFO("vcl.unx.print",
@@ -748,13 +675,11 @@ bool CUPSManager::printJobs( const PendingJob& job, const std::vector< OString >
system( aCmd.getStr() );
#endif
- for( std::vector< OString >::const_iterator it = files.begin();
- it != files.end();
- ++it )
- unlink( it->getStr());
-
+ unlink( it->second.getStr() );
+ m_aSpoolFiles.erase( pFile );
if( pOptions )
cupsFreeOptions( nNumOptions, pOptions );
+ }
return nJobID != 0;
}
diff --git a/vcl/unx/generic/printer/jobdata.cxx b/vcl/unx/generic/printer/jobdata.cxx
index f52e577bf31b..aead34c96eb1 100644
--- a/vcl/unx/generic/printer/jobdata.cxx
+++ b/vcl/unx/generic/printer/jobdata.cxx
@@ -52,24 +52,6 @@ JobData& JobData::operator=(const JobData& rRight)
return *this;
}
-bool psp::operator==(const psp::JobData& rLeft, const psp::JobData& rRight)
-{
- return rLeft.m_nCopies == rRight.m_nCopies
-// && rLeft.m_bCollate == rRight.m_bCollate
- && rLeft.m_nLeftMarginAdjust == rRight.m_nLeftMarginAdjust
- && rLeft.m_nRightMarginAdjust == rRight.m_nRightMarginAdjust
- && rLeft.m_nTopMarginAdjust == rRight.m_nTopMarginAdjust
- && rLeft.m_nBottomMarginAdjust == rRight.m_nBottomMarginAdjust
- && rLeft.m_nColorDepth == rRight.m_nColorDepth
- && rLeft.m_eOrientation == rRight.m_eOrientation
- && rLeft.m_aPrinterName == rRight.m_aPrinterName
- && rLeft.m_pParser == rRight.m_pParser
-// && rLeft.m_aContext == rRight.m_aContext
- && rLeft.m_nPSLevel == rRight.m_nPSLevel
- && rLeft.m_nPDFDevice == rRight.m_nPDFDevice
- && rLeft.m_nColorDevice == rRight.m_nColorDevice;
-}
-
void JobData::setCollate( bool bCollate )
{
if (m_nPDFDevice > 0)
diff --git a/vcl/unx/generic/printer/printerinfomanager.cxx b/vcl/unx/generic/printer/printerinfomanager.cxx
index c61a04c52aa4..993c898d068a 100644
--- a/vcl/unx/generic/printer/printerinfomanager.cxx
+++ b/vcl/unx/generic/printer/printerinfomanager.cxx
@@ -934,21 +934,6 @@ void PrinterInfoManager::setDefaultPaper( PPDContext& rContext ) const
}
}
-bool PrinterInfoManager::startBatchPrint()
-{
- return false; // not implemented
-}
-
-bool PrinterInfoManager::supportsBatchPrint() const
-{
- return false;
-}
-
-bool PrinterInfoManager::flushBatchPrint()
-{
- return false;
-}
-
SystemQueueInfo::SystemQueueInfo() :
m_bChanged( false )
{