summaryrefslogtreecommitdiff
path: root/vcl/unx/headless/svpprn.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/unx/headless/svpprn.cxx')
-rw-r--r--vcl/unx/headless/svpprn.cxx745
1 files changed, 45 insertions, 700 deletions
diff --git a/vcl/unx/headless/svpprn.cxx b/vcl/unx/headless/svpprn.cxx
index 0a5eb0ad0e7b..6f30f2d38969 100644
--- a/vcl/unx/headless/svpprn.cxx
+++ b/vcl/unx/headless/svpprn.cxx
@@ -1,3 +1,4 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -45,7 +46,9 @@
#include "svpinst.hxx"
using namespace psp;
-using namespace rtl;
+
+using ::rtl::OUString;
+using ::rtl::OUStringToOString;
/*
* static helpers
@@ -169,144 +172,6 @@ static void copyJobDataToJobSetup( ImplJobSetup* pJobSetup, JobData& rData )
}
}
-static bool passFileToCommandLine( const String& rFilename, const String& rCommandLine, bool bRemoveFile = true )
-{
- bool bSuccess = false;
-
- rtl_TextEncoding aEncoding = osl_getThreadTextEncoding();
- ByteString aCmdLine( rCommandLine, aEncoding );
- ByteString aFilename( rFilename, aEncoding );
-
- bool bPipe = aCmdLine.Search( "(TMP)" ) != STRING_NOTFOUND ? false : true;
-
- // setup command line for exec
- if( ! bPipe )
- while( aCmdLine.SearchAndReplace( "(TMP)", aFilename ) != STRING_NOTFOUND )
- ;
-
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "%s commandline: \"%s\"\n",
- bPipe ? "piping to" : "executing",
- aCmdLine.GetBuffer() );
- struct stat aStat;
- if( stat( aFilename.GetBuffer(), &aStat ) )
- fprintf( stderr, "stat( %s ) failed\n", aFilename.GetBuffer() );
- fprintf( stderr, "Tmp file %s has modes: 0%03lo\n", aFilename.GetBuffer(), (long)aStat.st_mode );
-#endif
- const char* argv[4];
- if( ! ( argv[ 0 ] = getenv( "SHELL" ) ) )
- argv[ 0 ] = "/bin/sh";
- argv[ 1 ] = "-c";
- argv[ 2 ] = aCmdLine.GetBuffer();
- argv[ 3 ] = 0;
-
- bool bHavePipes = false;
- int pid, fd[2];
-
- if( bPipe )
- bHavePipes = pipe( fd ) ? false : true;
- if( ( pid = fork() ) > 0 )
- {
- if( bPipe && bHavePipes )
- {
- close( fd[0] );
- char aBuffer[ 2048 ];
- FILE* fp = fopen( aFilename.GetBuffer(), "r" );
- while( fp && ! feof( fp ) )
- {
- int nBytes = fread( aBuffer, 1, sizeof( aBuffer ), fp );
- if( nBytes )
- write( fd[ 1 ], aBuffer, nBytes );
- }
- fclose( fp );
- close( fd[ 1 ] );
- }
- int status = 0;
- waitpid( pid, &status, 0 );
- if( ! status )
- bSuccess = true;
- }
- else if( ! pid )
- {
- if( bPipe && bHavePipes )
- {
- close( fd[1] );
- if( fd[0] != STDIN_FILENO ) // not probable, but who knows :)
- dup2( fd[0], STDIN_FILENO );
- }
- execv( argv[0], const_cast<char**>(argv) );
- fprintf( stderr, "failed to execute \"%s\"\n", aCmdLine.GetBuffer() );
- _exit( 1 );
- }
- else
- fprintf( stderr, "failed to fork\n" );
-
- // clean up the mess
- if( bRemoveFile )
- unlink( aFilename.GetBuffer() );
-
- return bSuccess;
-}
-
-static bool sendAFax( const String& rFaxNumber, const String& rFileName, const String& rCommand )
-{
- std::list< OUString > aFaxNumbers;
-
- if( ! rFaxNumber.Len() )
- return false;
-
- sal_Int32 nIndex = 0;
- OUString aFaxes( rFaxNumber );
- OUString aBeginToken( RTL_CONSTASCII_USTRINGPARAM("<Fax#>") );
- OUString aEndToken( RTL_CONSTASCII_USTRINGPARAM("</Fax#>") );
- while( nIndex != -1 )
- {
- nIndex = aFaxes.indexOf( aBeginToken, nIndex );
- if( nIndex != -1 )
- {
- sal_Int32 nBegin = nIndex + aBeginToken.getLength();
- nIndex = aFaxes.indexOf( aEndToken, nIndex );
- if( nIndex != -1 )
- {
- aFaxNumbers.push_back( aFaxes.copy( nBegin, nIndex-nBegin ) );
- nIndex += aEndToken.getLength();
- }
- }
- }
-
- bool bSuccess = true;
- if( aFaxNumbers.begin() != aFaxNumbers.end() )
- {
- while( aFaxNumbers.begin() != aFaxNumbers.end() && bSuccess )
- {
- String aCmdLine( rCommand );
- String aFaxNumber( aFaxNumbers.front() );
- aFaxNumbers.pop_front();
- while( aCmdLine.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "(PHONE)" ) ), aFaxNumber ) != STRING_NOTFOUND )
- ;
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "sending fax to \"%s\"\n", OUStringToOString( aFaxNumber, osl_getThreadTextEncoding() ).getStr() );
-#endif
- bSuccess = passFileToCommandLine( rFileName, aCmdLine, false );
- }
- }
- else
- bSuccess = false;
-
- // clean up temp file
- unlink( ByteString( rFileName, osl_getThreadTextEncoding() ).GetBuffer() );
-
- return bSuccess;
-}
-
-static bool createPdf( const String& rToFile, const String& rFromFile, const String& rCommandLine )
-{
- String aCommandLine( rCommandLine );
- while( aCommandLine.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "(OUTFILE)" ) ), rToFile ) != STRING_NOTFOUND )
- ;
- return passFileToCommandLine( rFromFile, aCommandLine );
-}
-
/*
* SalInstance
*/
@@ -317,7 +182,7 @@ SalInfoPrinter* SvpSalInstance::CreateInfoPrinter( SalPrinterQueueInfo* pQueueIn
ImplJobSetup* pJobSetup )
{
// create and initialize SalInfoPrinter
- PspSalInfoPrinter* pPrinter = new PspSalInfoPrinter;
+ SvpSalInfoPrinter* pPrinter = new SvpSalInfoPrinter;
if( pJobSetup )
{
@@ -336,7 +201,7 @@ SalInfoPrinter* SvpSalInstance::CreateInfoPrinter( SalPrinterQueueInfo* pQueueIn
// set/clear backwards compatibility flag
bool bStrictSO52Compatibility = false;
- std::hash_map<rtl::OUString, rtl::OUString, rtl::OUStringHash >::const_iterator compat_it =
+ boost::unordered_map<rtl::OUString, rtl::OUString, rtl::OUStringHash >::const_iterator compat_it =
pJobSetup->maValueMap.find( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StrictSO52Compatibility" ) ) );
if( compat_it != pJobSetup->maValueMap.end() )
{
@@ -362,8 +227,8 @@ void SvpSalInstance::DestroyInfoPrinter( SalInfoPrinter* pPrinter )
SalPrinter* SvpSalInstance::CreatePrinter( SalInfoPrinter* pInfoPrinter )
{
// create and initialize SalPrinter
- PspSalPrinter* pPrinter = new PspSalPrinter( pInfoPrinter );
- pPrinter->m_aJobData = static_cast<PspSalInfoPrinter*>(pInfoPrinter)->m_aJobData;
+ SvpSalPrinter* pPrinter = new SvpSalPrinter( pInfoPrinter );
+ pPrinter->m_aJobData = static_cast<SvpSalInfoPrinter*>(pInfoPrinter)->m_aJobData;
return pPrinter;
}
@@ -436,574 +301,37 @@ String SvpSalInstance::GetDefaultPrinter()
return rManager.getDefaultPrinter();
}
-// =======================================================================
-
-PspSalInfoPrinter::PspSalInfoPrinter()
-{
- m_pGraphics = NULL;
- m_bPapersInit = false;
-}
-
-// -----------------------------------------------------------------------
-
-PspSalInfoPrinter::~PspSalInfoPrinter()
-{
- if( m_pGraphics )
- {
- delete m_pGraphics;
- m_pGraphics = NULL;
- }
-}
-
-// -----------------------------------------------------------------------
-
-void PspSalInfoPrinter::InitPaperFormats( const ImplJobSetup* )
-{
- m_aPaperFormats.clear();
- m_bPapersInit = true;
-
- if( m_aJobData.m_pParser )
- {
- const PPDKey* pKey = m_aJobData.m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) ) );
- if( pKey )
- {
- int nValues = pKey->countValues();
- for( int i = 0; i < nValues; i++ )
- {
- const PPDValue* pValue = pKey->getValue( i );
- int nWidth = 0, nHeight = 0;
- m_aJobData.m_pParser->getPaperDimension( pValue->m_aOption, nWidth, nHeight );
- PaperInfo aInfo(PtTo10Mu( nWidth ), PtTo10Mu( nHeight ));
- m_aPaperFormats.push_back( aInfo );
- }
- }
- }
-}
-
-// -----------------------------------------------------------------------
-
-int PspSalInfoPrinter::GetLandscapeAngle( const ImplJobSetup* )
-{
- return 900;
-}
-
-// -----------------------------------------------------------------------
-
-SalGraphics* PspSalInfoPrinter::GetGraphics()
-{
- // return a valid pointer only once
- // the reasoning behind this is that we could have different
- // SalGraphics that can run in multiple threads
- // (future plans)
- SalGraphics* pRet = NULL;
- if( ! m_pGraphics )
- {
- m_pGraphics = new PspGraphics( &m_aJobData, &m_aPrinterGfx, NULL, false, this );
- m_pGraphics->SetLayout( 0 );
- pRet = m_pGraphics;
- }
- return pRet;
-}
-
-// -----------------------------------------------------------------------
-
-void PspSalInfoPrinter::ReleaseGraphics( SalGraphics* pGraphics )
-{
- if( pGraphics == m_pGraphics )
- {
- delete pGraphics;
- m_pGraphics = NULL;
- }
- return;
-}
-
-// -----------------------------------------------------------------------
-
-sal_Bool PspSalInfoPrinter::Setup( SalFrame*, ImplJobSetup* )
-{
- return sal_False;
-}
-
-// -----------------------------------------------------------------------
-
-// This function gets the driver data and puts it into pJobSetup
-// If pJobSetup->mpDriverData is NOT NULL, then the independend
-// data should be merged into the driver data
-// If pJobSetup->mpDriverData IS NULL, then the driver defaults
-// should be merged into the independent data
-sal_Bool PspSalInfoPrinter::SetPrinterData( ImplJobSetup* pJobSetup )
-{
- if( pJobSetup->mpDriverData )
- return SetData( ~0, pJobSetup );
-
- copyJobDataToJobSetup( pJobSetup, m_aJobData );
-
- // set/clear backwards compatibility flag
- bool bStrictSO52Compatibility = false;
- std::hash_map<rtl::OUString, rtl::OUString, rtl::OUStringHash >::const_iterator compat_it =
- pJobSetup->maValueMap.find( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StrictSO52Compatibility" ) ) );
- if( compat_it != pJobSetup->maValueMap.end() )
- {
- if( compat_it->second.equalsIgnoreAsciiCaseAscii( "true" ) )
- bStrictSO52Compatibility = true;
- }
- m_aPrinterGfx.setStrictSO52Compatibility( bStrictSO52Compatibility );
-
- return sal_True;
-}
-
// -----------------------------------------------------------------------
-// This function merges the independ driver data
-// and sets the new independ data in pJobSetup
-// Only the data must be changed, where the bit
-// in nGetDataFlags is set
-sal_Bool PspSalInfoPrinter::SetData(
- sal_uLong nSetDataFlags,
- ImplJobSetup* pJobSetup )
+sal_Bool SvpSalInfoPrinter::Setup( SalFrame*, ImplJobSetup* )
{
- JobData aData;
- JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, aData );
-
- if( aData.m_pParser )
- {
- const PPDKey* pKey;
- const PPDValue* pValue;
-
- // merge papersize if necessary
- if( nSetDataFlags & SAL_JOBSET_PAPERSIZE )
- {
- int nWidth, nHeight;
- if( pJobSetup->meOrientation == ORIENTATION_PORTRAIT )
- {
- nWidth = pJobSetup->mnPaperWidth;
- nHeight = pJobSetup->mnPaperHeight;
- }
- else
- {
- nWidth = pJobSetup->mnPaperHeight;
- nHeight = pJobSetup->mnPaperWidth;
- }
- String aPaper;
-
- if( pJobSetup->mePaperFormat == PAPER_USER )
- aPaper = aData.m_pParser->matchPaper(
- TenMuToPt( pJobSetup->mnPaperWidth ),
- TenMuToPt( pJobSetup->mnPaperHeight ) );
- else
- aPaper = rtl::OStringToOUString(PaperInfo::toPSName(pJobSetup->mePaperFormat), RTL_TEXTENCODING_ISO_8859_1);
-
- pKey = aData.m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) ) );
- pValue = pKey ? pKey->getValue( aPaper ) : NULL;
- if( ! ( pKey && pValue && aData.m_aContext.setValue( pKey, pValue, false ) == pValue ) )
- return sal_False;
- }
-
- // merge paperbin if necessary
- if( nSetDataFlags & SAL_JOBSET_PAPERBIN )
- {
- pKey = aData.m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "InputSlot" ) ) );
- if( pKey )
- {
- int nPaperBin = pJobSetup->mnPaperBin;
- if( nPaperBin == 0xffff )
- pValue = pKey->getDefaultValue();
- else
- pValue = pKey->getValue( pJobSetup->mnPaperBin );
-
- // may fail due to constraints;
- // real paper bin is copied back to jobsetup in that case
- aData.m_aContext.setValue( pKey, pValue );
- }
- // if printer has no InputSlot key simply ignore this setting
- // (e.g. SGENPRT has no InputSlot)
- }
-
- // merge orientation if necessary
- if( nSetDataFlags & SAL_JOBSET_ORIENTATION )
- aData.m_eOrientation = pJobSetup->meOrientation == ORIENTATION_LANDSCAPE ? orientation::Landscape : orientation::Portrait;
-
- // merge duplex if necessary
- if( nSetDataFlags & SAL_JOBSET_DUPLEXMODE )
- {
- pKey = aData.m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "Duplex" ) ) );
- if( pKey )
- {
- pValue = NULL;
- switch( pJobSetup->meDuplexMode )
- {
- case DUPLEX_OFF:
- pValue = pKey->getValue( String( RTL_CONSTASCII_USTRINGPARAM( "None" ) ) );
- if( pValue == NULL )
- pValue = pKey->getValue( String( RTL_CONSTASCII_USTRINGPARAM( "SimplexNoTumble" ) ) );
- break;
- case DUPLEX_SHORTEDGE:
- pValue = pKey->getValue( String( RTL_CONSTASCII_USTRINGPARAM( "DuplexTumble" ) ) );
- break;
- case DUPLEX_LONGEDGE:
- pValue = pKey->getValue( String( RTL_CONSTASCII_USTRINGPARAM( "DuplexNoTumble" ) ) );
- break;
- case DUPLEX_UNKNOWN:
- default:
- pValue = 0;
- break;
- }
- if( ! pValue )
- pValue = pKey->getDefaultValue();
- aData.m_aContext.setValue( pKey, pValue );
- }
- }
-
- m_aJobData = aData;
- copyJobDataToJobSetup( pJobSetup, aData );
- return sal_True;
- }
-
return sal_False;
}
-// -----------------------------------------------------------------------
-
-void PspSalInfoPrinter::GetPageInfo(
- const ImplJobSetup* pJobSetup,
- long& rOutWidth, long& rOutHeight,
- long& rPageOffX, long& rPageOffY,
- long& rPageWidth, long& rPageHeight )
-{
- if( ! pJobSetup )
- return;
-
- JobData aData;
- JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, aData );
-
- // get the selected page size
- if( aData.m_pParser )
- {
-
- String aPaper;
- int width, height;
- int left = 0, top = 0, right = 0, bottom = 0;
- int nDPI = aData.m_aContext.getRenderResolution();
-
-
- if( aData.m_eOrientation == psp::orientation::Portrait )
- {
- aData.m_aContext.getPageSize( aPaper, width, height );
- aData.m_pParser->getMargins( aPaper, left, right, top, bottom );
- }
- else
- {
- aData.m_aContext.getPageSize( aPaper, height, width );
- aData.m_pParser->getMargins( aPaper, top, bottom, right, left );
- }
-
- rPageWidth = width * nDPI / 72;
- rPageHeight = height * nDPI / 72;
- rPageOffX = left * nDPI / 72;
- rPageOffY = top * nDPI / 72;
- rOutWidth = ( width - left - right ) * nDPI / 72;
- rOutHeight = ( height - top - bottom ) * nDPI / 72;
- }
-}
-
-// -----------------------------------------------------------------------
-
-sal_uLong PspSalInfoPrinter::GetPaperBinCount( const ImplJobSetup* pJobSetup )
-{
- if( ! pJobSetup )
- return 0;
-
- JobData aData;
- JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, aData );
-
- const PPDKey* pKey = aData.m_pParser ? aData.m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "InputSlot" ) ) ): NULL;
- return pKey ? pKey->countValues() : 0;
-}
-
-// -----------------------------------------------------------------------
-
-String PspSalInfoPrinter::GetPaperBinName( const ImplJobSetup* pJobSetup, sal_uLong nPaperBin )
-{
- JobData aData;
- JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, aData );
-
- String aRet;
- if( aData.m_pParser )
- {
- const PPDKey* pKey = aData.m_pParser ? aData.m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "InputSlot" ) ) ): NULL;
- if( nPaperBin == 0xffff || ! pKey )
- aRet = aData.m_pParser->getDefaultInputSlot();
- else
- {
- const PPDValue* pValue = pKey->getValue( nPaperBin );
- if( pValue )
- aRet = aData.m_pParser->translateOption( pKey->getKey(), pValue->m_aOption );
- }
- }
-
- return aRet;
-}
-
-// -----------------------------------------------------------------------
-
-sal_uLong PspSalInfoPrinter::GetCapabilities( const ImplJobSetup* pJobSetup, sal_uInt16 nType )
-{
- switch( nType )
- {
- case PRINTER_CAPABILITIES_SUPPORTDIALOG:
- return 1;
- case PRINTER_CAPABILITIES_COPIES:
- 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( String( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ) ) : NULL;
- const PPDValue* pVal = pKey ? pKey->getValue( String( RTL_CONSTASCII_USTRINGPARAM( "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;
- }
- case PRINTER_CAPABILITIES_SETORIENTATION:
- return 1;
- case PRINTER_CAPABILITIES_SETDUPLEX:
- return 1;
- case PRINTER_CAPABILITIES_SETPAPERBIN:
- return 1;
- case PRINTER_CAPABILITIES_SETPAPERSIZE:
- return 1;
- case PRINTER_CAPABILITIES_SETPAPER:
- return 0;
- case PRINTER_CAPABILITIES_FAX:
- {
- PrinterInfoManager& rManager = PrinterInfoManager::get();
- PrinterInfo aInfo( rManager.getPrinterInfo( pJobSetup->maPrinterName ) );
- String aFeatures( aInfo.m_aFeatures );
- int nTokenCount = aFeatures.GetTokenCount( ',' );
- for( int i = 0; i < nTokenCount; i++ )
- {
- if( aFeatures.GetToken( i ).CompareToAscii( "fax", 3 ) == COMPARE_EQUAL )
- return 1;
- }
- return 0;
- }
- case PRINTER_CAPABILITIES_PDF:
- {
- PrinterInfoManager& rManager = PrinterInfoManager::get();
- PrinterInfo aInfo( rManager.getPrinterInfo( pJobSetup->maPrinterName ) );
- String aFeatures( aInfo.m_aFeatures );
- int nTokenCount = aFeatures.GetTokenCount( ',' );
- for( int i = 0; i < nTokenCount; i++ )
- {
- if( aFeatures.GetToken( i ).CompareToAscii( "pdf=", 4 ) == COMPARE_EQUAL )
- return 1;
- }
- return 0;
- }
- default: break;
- };
- return 0;
-}
-
-// =======================================================================
-
/*
- * SalPrinter
+ * svp::PrinterUpdate
*/
-PspSalPrinter::PspSalPrinter( SalInfoPrinter* pInfoPrinter )
- : m_bFax( false ),
- m_bPdf( false ),
- m_bSwallowFaxNo( false ),
- m_pGraphics( NULL ),
- m_nCopies( 1 ),
- m_bCollate( false ),
- m_pInfoPrinter( pInfoPrinter )
+namespace svp
{
-}
-
-// -----------------------------------------------------------------------
-
-PspSalPrinter::~PspSalPrinter()
-{
-}
-
-// -----------------------------------------------------------------------
-
-static String getTmpName()
-{
- rtl::OUString aTmp, aSys;
- osl_createTempFile( NULL, NULL, &aTmp.pData );
- osl_getSystemPathFromFileURL( aTmp.pData, &aSys.pData );
-
- return aSys;
-}
-
-sal_Bool PspSalPrinter::StartJob(
- const XubString* pFileName,
- const XubString& rJobName,
- const XubString& rAppName,
- sal_uLong nCopies,
- bool bCollate,
- bool /*bDirect*/,
- ImplJobSetup* pJobSetup )
-{
- vcl_sal::PrinterUpdate::jobStarted();
-
- m_bFax = false;
- m_bPdf = false;
- m_aFileName = pFileName ? *pFileName : String();
- m_aTmpFile = String();
- m_nCopies = nCopies;
- m_bCollate = bCollate;
-
- JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, m_aJobData );
- if( m_nCopies > 1 )
- {
- // in case user did not do anything (m_nCopies=1)
- // take the default from jobsetup
- m_aJobData.m_nCopies = m_nCopies;
- m_aJobData.setCollate( bCollate );
- }
-
- // check wether this printer is configured as fax
- int nMode = 0;
- const PrinterInfo& rInfo( PrinterInfoManager::get().getPrinterInfo( m_aJobData.m_aPrinterName ) );
- sal_Int32 nIndex = 0;
- while( nIndex != -1 )
+ class PrinterUpdate
{
- OUString aToken( rInfo.m_aFeatures.getToken( 0, ',', nIndex ) );
- if( ! aToken.compareToAscii( "fax", 3 ) )
- {
- m_bFax = true;
- m_aTmpFile = getTmpName();
- nMode = S_IRUSR | S_IWUSR;
+ static Timer* pPrinterUpdateTimer;
+ static int nActiveJobs;
- ::std::hash_map< ::rtl::OUString, ::rtl::OUString, ::rtl::OUStringHash >::const_iterator it;
- it = pJobSetup->maValueMap.find( ::rtl::OUString::createFromAscii( "FAX#" ) );
- if( it != pJobSetup->maValueMap.end() )
- m_aFaxNr = it->second;
-
- sal_Int32 nPos = 0;
- m_bSwallowFaxNo = ! aToken.getToken( 1, '=', nPos ).compareToAscii( "swallow", 7 ) ? true : false;
-
- break;
- }
- if( ! aToken.compareToAscii( "pdf=", 4 ) )
- {
- m_bPdf = true;
- m_aTmpFile = getTmpName();
- nMode = S_IRUSR | S_IWUSR;
-
- if( ! m_aFileName.Len() )
- {
- m_aFileName = getPdfDir( rInfo );
- m_aFileName.Append( '/' );
- m_aFileName.Append( rJobName );
- m_aFileName.AppendAscii( ".pdf" );
- }
- break;
- }
- }
- m_aPrinterGfx.Init( m_aJobData );
-
- // set/clear backwards compatibility flag
- bool bStrictSO52Compatibility = false;
- std::hash_map<rtl::OUString, rtl::OUString, rtl::OUStringHash >::const_iterator compat_it =
- pJobSetup->maValueMap.find( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StrictSO52Compatibility" ) ) );
- if( compat_it != pJobSetup->maValueMap.end() )
- {
- if( compat_it->second.equalsIgnoreAsciiCaseAscii( "true" ) )
- bStrictSO52Compatibility = true;
- }
- m_aPrinterGfx.setStrictSO52Compatibility( bStrictSO52Compatibility );
-
- return m_aPrintJob.StartJob( m_aTmpFile.Len() ? m_aTmpFile : m_aFileName, nMode, rJobName, rAppName, m_aJobData, &m_aPrinterGfx, false ) ? sal_True : sal_False;
-}
-
-// -----------------------------------------------------------------------
-
-sal_Bool PspSalPrinter::EndJob()
-{
- sal_Bool bSuccess = m_aPrintJob.EndJob();
-
- if( bSuccess )
- {
- // check for fax
- if( m_bFax )
- {
-
- const PrinterInfo& rInfo( PrinterInfoManager::get().getPrinterInfo( m_aJobData.m_aPrinterName ) );
- // sendAFax removes the file after use
- bSuccess = sendAFax( m_aFaxNr, m_aTmpFile, rInfo.m_aCommand );
- }
- else if( m_bPdf )
- {
- const PrinterInfo& rInfo( PrinterInfoManager::get().getPrinterInfo( m_aJobData.m_aPrinterName ) );
- bSuccess = createPdf( m_aFileName, m_aTmpFile, rInfo.m_aCommand );
- }
- }
- vcl_sal::PrinterUpdate::jobEnded();
- return bSuccess;
-}
-
-// -----------------------------------------------------------------------
-
-sal_Bool PspSalPrinter::AbortJob()
-{
- sal_Bool bAbort = m_aPrintJob.AbortJob() ? sal_True : sal_False;
- vcl_sal::PrinterUpdate::jobEnded();
- return bAbort;
-}
-
-// -----------------------------------------------------------------------
-
-SalGraphics* PspSalPrinter::StartPage( ImplJobSetup* pJobSetup, sal_Bool )
-{
- JobData::constructFromStreamBuffer( pJobSetup->mpDriverData, pJobSetup->mnDriverDataLen, m_aJobData );
- m_pGraphics = new PspGraphics( &m_aJobData, &m_aPrinterGfx, m_bFax ? &m_aFaxNr : NULL, m_bSwallowFaxNo, m_pInfoPrinter );
- m_pGraphics->SetLayout( 0 );
- if( m_nCopies > 1 )
- {
- // in case user did not do anything (m_nCopies=1)
- // take the default from jobsetup
- m_aJobData.m_nCopies = m_nCopies;
- m_aJobData.setCollate( m_nCopies > 1 && m_bCollate );
- }
-
- m_aPrintJob.StartPage( m_aJobData );
- m_aPrinterGfx.Init( m_aPrintJob );
-
- return m_pGraphics;
-}
-
-// -----------------------------------------------------------------------
-
-sal_Bool PspSalPrinter::EndPage()
-{
- sal_Bool bResult = m_aPrintJob.EndPage();
- m_aPrinterGfx.Clear();
- return bResult ? sal_True : sal_False;
-}
-
-// -----------------------------------------------------------------------
-
-sal_uLong PspSalPrinter::GetErrorCode()
-{
- return 0;
+ static void doUpdate();
+ DECL_STATIC_LINK( PrinterUpdate, UpdateTimerHdl, void* );
+ public:
+ static void update();
+ static void jobStarted() { nActiveJobs++; }
+ static void jobEnded();
+ };
}
-/*
- * vcl::PrinterUpdate
- */
-
-Timer* vcl_sal::PrinterUpdate::pPrinterUpdateTimer = NULL;
-int vcl_sal::PrinterUpdate::nActiveJobs = 0;
+Timer* svp::PrinterUpdate::pPrinterUpdateTimer = NULL;
+int svp::PrinterUpdate::nActiveJobs = 0;
-void vcl_sal::PrinterUpdate::doUpdate()
+void svp::PrinterUpdate::doUpdate()
{
::psp::PrinterInfoManager& rManager( ::psp::PrinterInfoManager::get() );
if( rManager.checkPrintersChanged( false ) && SvpSalInstance::s_pDefaultInstance )
@@ -1017,7 +345,7 @@ void vcl_sal::PrinterUpdate::doUpdate()
// -----------------------------------------------------------------------
-IMPL_STATIC_LINK_NOINSTANCE( vcl_sal::PrinterUpdate, UpdateTimerHdl, void*, )
+IMPL_STATIC_LINK_NOINSTANCE( svp::PrinterUpdate, UpdateTimerHdl, void*, )
{
if( nActiveJobs < 1 )
{
@@ -1033,7 +361,7 @@ IMPL_STATIC_LINK_NOINSTANCE( vcl_sal::PrinterUpdate, UpdateTimerHdl, void*, )
// -----------------------------------------------------------------------
-void vcl_sal::PrinterUpdate::update()
+void svp::PrinterUpdate::update()
{
if( Application::GetSettings().GetMiscSettings().GetDisablePrinting() )
return;
@@ -1053,14 +381,19 @@ void vcl_sal::PrinterUpdate::update()
{
pPrinterUpdateTimer = new Timer();
pPrinterUpdateTimer->SetTimeout( 500 );
- pPrinterUpdateTimer->SetTimeoutHdl( STATIC_LINK( NULL, vcl_sal::PrinterUpdate, UpdateTimerHdl ) );
+ pPrinterUpdateTimer->SetTimeoutHdl( STATIC_LINK( NULL, svp::PrinterUpdate, UpdateTimerHdl ) );
pPrinterUpdateTimer->Start();
}
}
+void SvpSalInstance::updatePrinterUpdate()
+{
+ svp::PrinterUpdate::update();
+}
+
// -----------------------------------------------------------------------
-void vcl_sal::PrinterUpdate::jobEnded()
+void svp::PrinterUpdate::jobEnded()
{
nActiveJobs--;
if( nActiveJobs < 1 )
@@ -1074,3 +407,15 @@ void vcl_sal::PrinterUpdate::jobEnded()
}
}
}
+
+void SvpSalInstance::jobStartedPrinterUpdate()
+{
+ svp::PrinterUpdate::jobStarted();
+}
+
+void SvpSalInstance::jobEndedPrinterUpdate()
+{
+ svp::PrinterUpdate::jobEnded();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */