Kaydet (Commit) dea0abc5 authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski

tdf#93236 Revert "support fast MM printing in...

non-single-file mode only for CUPS"

This reverts commit 138d29aa.

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
üst 4ba9bf6a
#ifndef CONFIG_CUPS_H
#define CONFIG_CUPS_H
#define ENABLE_CUPS 0
#endif
......@@ -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])
......
......@@ -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
......
......@@ -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();
};
......
......@@ -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 );
......
......@@ -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;
......
......@@ -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;
}
......
......@@ -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)
......
......@@ -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 )
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment