LCOV - code coverage report
Current view: top level - vcl/source/gdi - print.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 205 773 26.5 %
Date: 2012-08-25 Functions: 24 65 36.9 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 115 961 12.0 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : 
      30                 :            : #include <list>
      31                 :            : 
      32                 :            : #include <tools/debug.hxx>
      33                 :            : #include <tools/resary.hxx>
      34                 :            : #include <tools/stream.hxx>
      35                 :            : #include <tools/vcompat.hxx>
      36                 :            : 
      37                 :            : #include <vcl/unohelp.hxx>
      38                 :            : #include <vcl/svapp.hxx>
      39                 :            : #include <vcl/wrkwin.hxx>
      40                 :            : #include <vcl/virdev.hxx>
      41                 :            : #include <vcl/window.hxx>
      42                 :            : #include <vcl/gdimtf.hxx>
      43                 :            : #include <vcl/metaact.hxx>
      44                 :            : #include <vcl/print.hxx>
      45                 :            : 
      46                 :            : #include <salinst.hxx>
      47                 :            : #include <salgdi.hxx>
      48                 :            : #include <salptype.hxx>
      49                 :            : #include <salprn.hxx>
      50                 :            : #include <svdata.hxx>
      51                 :            : #include <svids.hrc>
      52                 :            : #include <jobset.h>
      53                 :            : #include <outdev.h>
      54                 :            : #include <print.h>
      55                 :            : 
      56                 :            : #include <comphelper/processfactory.hxx>
      57                 :            : 
      58                 :            : #include "com/sun/star/beans/XPropertySet.hpp"
      59                 :            : #include "com/sun/star/container/XNameAccess.hpp"
      60                 :            : #include "com/sun/star/lang/XMultiServiceFactory.hpp"
      61                 :            : 
      62                 :            : using namespace com::sun::star::uno;
      63                 :            : using namespace com::sun::star::lang;
      64                 :            : using namespace com::sun::star::beans;
      65                 :            : using namespace com::sun::star::container;
      66                 :            : 
      67                 :            : int nImplSysDialog = 0;
      68                 :            : 
      69                 :            : // =======================================================================
      70                 :            : 
      71                 :            : namespace
      72                 :            : {
      73                 :          0 :     static Paper ImplGetPaperFormat( long nWidth100thMM, long nHeight100thMM )
      74                 :            :     {
      75         [ #  # ]:          0 :         PaperInfo aInfo(nWidth100thMM, nHeight100thMM);
      76         [ #  # ]:          0 :         aInfo.doSloppyFit();
      77                 :          0 :         return aInfo.getPaper();
      78                 :            :     }
      79                 :            : 
      80                 :            : // -----------------------------------------------------------------------
      81                 :            : 
      82                 :          0 :     static const PaperInfo& ImplGetEmptyPaper()
      83                 :            :     {
      84 [ #  # ][ #  # ]:          0 :         static PaperInfo aInfo(PAPER_USER);
         [ #  # ][ #  # ]
      85                 :          0 :         return aInfo;
      86                 :            :     }
      87                 :            : }
      88                 :            : 
      89                 :            : // =======================================================================
      90                 :            : 
      91                 :        112 : void ImplUpdateJobSetupPaper( JobSetup& rJobSetup )
      92                 :            : {
      93                 :        112 :     const ImplJobSetup* pConstData = rJobSetup.ImplGetConstData();
      94                 :            : 
      95 [ #  # ][ -  + ]:        112 :     if ( !pConstData->mnPaperWidth || !pConstData->mnPaperHeight )
      96                 :            :     {
      97         [ +  - ]:        112 :         if ( pConstData->mePaperFormat != PAPER_USER )
      98                 :            :         {
      99         [ +  - ]:        112 :             ImplJobSetup* pData  = rJobSetup.ImplGetData();
     100         [ +  - ]:        112 :             PaperInfo aInfo(pConstData->mePaperFormat);
     101                 :        112 :             pData->mnPaperWidth  = aInfo.getWidth();
     102                 :        112 :             pData->mnPaperHeight = aInfo.getHeight();
     103                 :        112 :         }
     104                 :            :     }
     105         [ #  # ]:          0 :     else if ( pConstData->mePaperFormat == PAPER_USER )
     106                 :            :     {
     107                 :          0 :         Paper ePaper = ImplGetPaperFormat( pConstData->mnPaperWidth, pConstData->mnPaperHeight );
     108         [ #  # ]:          0 :         if ( ePaper != PAPER_USER )
     109                 :          0 :             rJobSetup.ImplGetData()->mePaperFormat = ePaper;
     110                 :            :     }
     111                 :        112 : }
     112                 :            : 
     113                 :            : // ------------------
     114                 :            : // - PrinterOptions -
     115                 :            : // ------------------
     116                 :            : 
     117                 :        243 : PrinterOptions::PrinterOptions() :
     118                 :            :     mbReduceTransparency( sal_False ),
     119                 :            :     meReducedTransparencyMode( PRINTER_TRANSPARENCY_AUTO ),
     120                 :            :     mbReduceGradients( sal_False ),
     121                 :            :     meReducedGradientsMode( PRINTER_GRADIENT_STRIPES ),
     122                 :            :     mnReducedGradientStepCount( 64 ),
     123                 :            :     mbReduceBitmaps( sal_False ),
     124                 :            :     meReducedBitmapMode( PRINTER_BITMAP_NORMAL ),
     125                 :            :     mnReducedBitmapResolution( 200 ),
     126                 :            :     mbReducedBitmapsIncludeTransparency( sal_True ),
     127                 :        243 :     mbConvertToGreyscales( sal_False )
     128                 :            : {
     129                 :        243 : }
     130                 :            : 
     131                 :            : // -----------------------------------------------------------------------
     132                 :            : 
     133                 :        239 : PrinterOptions::~PrinterOptions()
     134                 :            : {
     135                 :        239 : }
     136                 :            : 
     137                 :            : #define PROPERTYNAME_REDUCETRANSPARENCY                 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceTransparency"))
     138                 :            : #define PROPERTYNAME_REDUCEDTRANSPARENCYMODE            rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedTransparencyMode"))
     139                 :            : #define PROPERTYNAME_REDUCEGRADIENTS                    rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceGradients"))
     140                 :            : #define PROPERTYNAME_REDUCEDGRADIENTMODE                rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedGradientMode"))
     141                 :            : #define PROPERTYNAME_REDUCEDGRADIENTSTEPCOUNT           rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedGradientStepCount"))
     142                 :            : #define PROPERTYNAME_REDUCEBITMAPS                      rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReduceBitmaps"))
     143                 :            : #define PROPERTYNAME_REDUCEDBITMAPMODE                  rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapMode"))
     144                 :            : #define PROPERTYNAME_REDUCEDBITMAPRESOLUTION            rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapResolution"))
     145                 :            : #define PROPERTYNAME_REDUCEDBITMAPINCLUDESTRANSPARENCY  rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReducedBitmapIncludesTransparency"))
     146                 :            : #define PROPERTYNAME_CONVERTTOGREYSCALES                rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ConvertToGreyscales"))
     147                 :            : 
     148                 :          0 : bool PrinterOptions::ReadFromConfig( bool i_bFile )
     149                 :            : {
     150                 :          0 :     bool bSuccess = false;
     151                 :            :     // save old state in case something goes wrong
     152                 :          0 :     PrinterOptions aOldValues( *this );
     153                 :            : 
     154                 :            :     // get the configuration service
     155                 :          0 :     Reference< XMultiServiceFactory > xConfigProvider;
     156                 :          0 :     Reference< XNameAccess > xConfigAccess;
     157                 :            :     try
     158                 :            :     {
     159                 :            :         // get service provider
     160         [ #  # ]:          0 :         Reference< XMultiServiceFactory > xSMgr( comphelper::getProcessServiceFactory() );
     161                 :            :         // create configuration hierachical access name
     162         [ #  # ]:          0 :         if( xSMgr.is() )
     163                 :            :         {
     164                 :            :             try
     165                 :            :             {
     166                 :            :                 xConfigProvider = Reference< XMultiServiceFactory >(
     167         [ #  # ]:          0 :                         xSMgr->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
     168                 :          0 :                                         "com.sun.star.configuration.ConfigurationProvider" ))),
     169 [ #  # ][ #  # ]:          0 :                         UNO_QUERY );
         [ #  # ][ #  # ]
     170         [ #  # ]:          0 :                 if( xConfigProvider.is() )
     171                 :            :                 {
     172         [ #  # ]:          0 :                     Sequence< Any > aArgs(1);
     173                 :          0 :                     PropertyValue aVal;
     174         [ #  # ]:          0 :                     aVal.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) );
     175         [ #  # ]:          0 :                     if( i_bFile )
     176 [ #  # ][ #  # ]:          0 :                         aVal.Value <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Print/Option/File" ) );
     177                 :            :                     else
     178 [ #  # ][ #  # ]:          0 :                         aVal.Value <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/Print/Option/Printer" ) );
     179 [ #  # ][ #  # ]:          0 :                     aArgs.getArray()[0] <<= aVal;
     180                 :            :                     xConfigAccess = Reference< XNameAccess >(
     181         [ #  # ]:          0 :                             xConfigProvider->createInstanceWithArguments(
     182                 :          0 :                                 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" )), aArgs ),
     183 [ #  # ][ #  # ]:          0 :                                 UNO_QUERY );
         [ #  # ][ #  # ]
     184         [ #  # ]:          0 :                     if( xConfigAccess.is() )
     185                 :            :                     {
     186         [ #  # ]:          0 :                         Reference< XPropertySet > xSet( xConfigAccess, UNO_QUERY );
     187         [ #  # ]:          0 :                         if( xSet.is() )
     188                 :            :                         {
     189                 :          0 :                             sal_Int32 nValue = 0;
     190                 :          0 :                             sal_Bool  bValue = 0;
     191 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCETRANSPARENCY) >>= bValue )
         [ #  # ][ #  # ]
     192                 :          0 :                                 SetReduceTransparency( bValue );
     193 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDTRANSPARENCYMODE) >>= nValue )
         [ #  # ][ #  # ]
     194                 :          0 :                                 SetReducedTransparencyMode( (PrinterTransparencyMode)nValue );
     195 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEGRADIENTS) >>= bValue )
         [ #  # ][ #  # ]
     196                 :          0 :                                 SetReduceGradients( bValue );
     197 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDGRADIENTMODE) >>= nValue )
         [ #  # ][ #  # ]
     198                 :          0 :                                 SetReducedGradientMode( (PrinterGradientMode)nValue );
     199 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDGRADIENTSTEPCOUNT) >>= nValue )
         [ #  # ][ #  # ]
     200                 :          0 :                                 SetReducedGradientStepCount( (sal_uInt16)nValue );
     201 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEBITMAPS) >>= bValue )
         [ #  # ][ #  # ]
     202                 :          0 :                                 SetReduceBitmaps( bValue );
     203 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPMODE) >>= nValue )
         [ #  # ][ #  # ]
     204                 :          0 :                                 SetReducedBitmapMode( (PrinterBitmapMode)nValue );
     205 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPRESOLUTION) >>= nValue )
         [ #  # ][ #  # ]
     206                 :          0 :                                 SetReducedBitmapResolution( (sal_uInt16)nValue );
     207 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_REDUCEDBITMAPINCLUDESTRANSPARENCY) >>= bValue )
         [ #  # ][ #  # ]
     208                 :          0 :                                 SetReducedBitmapIncludesTransparency( bValue );
     209 [ #  # ][ #  # ]:          0 :                             if( xSet->getPropertyValue(PROPERTYNAME_CONVERTTOGREYSCALES) >>= bValue )
         [ #  # ][ #  # ]
     210                 :          0 :                                 SetConvertToGreyscales( bValue );
     211                 :            : 
     212                 :          0 :                             bSuccess = true;
     213                 :          0 :                         }
     214 [ #  # ][ #  # ]:          0 :                     }
     215                 :            :                 }
     216                 :            :             }
     217         [ #  # ]:          0 :             catch( Exception& )
     218                 :            :             {
     219                 :            :             }
     220         [ #  # ]:          0 :         }
     221                 :            :     }
     222         [ #  # ]:          0 :     catch( WrappedTargetException& )
     223                 :            :     {
     224                 :            :     }
     225                 :            : 
     226         [ #  # ]:          0 :     if( ! bSuccess )
     227                 :          0 :         *this = aOldValues;
     228         [ #  # ]:          0 :     return bSuccess;
     229                 :            : }
     230                 :            : 
     231                 :          0 : void Printer::SetPrinterOptions( const PrinterOptions& i_rOptions )
     232                 :            : {
     233                 :          0 :     *mpPrinterOptions = i_rOptions;
     234                 :          0 : }
     235                 :            : 
     236                 :            : // -------------
     237                 :            : // - QueueInfo -
     238                 :            : // -------------
     239                 :            : 
     240                 :          0 : QueueInfo::QueueInfo()
     241                 :            : {
     242                 :          0 :     mnStatus    = 0;
     243                 :          0 :     mnJobs      = 0;
     244                 :          0 : }
     245                 :            : 
     246                 :            : // -----------------------------------------------------------------------
     247                 :            : 
     248                 :          0 : QueueInfo::QueueInfo( const QueueInfo& rInfo ) :
     249                 :            :     maPrinterName( rInfo.maPrinterName ),
     250                 :            :     maDriver( rInfo.maDriver ),
     251                 :            :     maLocation( rInfo.maLocation ),
     252                 :            :     maComment( rInfo.maComment ),
     253                 :            :     mnStatus( rInfo.mnStatus ),
     254                 :          0 :     mnJobs( rInfo.mnJobs )
     255                 :            : {
     256                 :          0 : }
     257                 :            : 
     258                 :            : // -----------------------------------------------------------------------
     259                 :            : 
     260                 :          0 : QueueInfo::~QueueInfo()
     261                 :            : {
     262                 :          0 : }
     263                 :            : 
     264                 :            : // -----------------------------------------------------------------------
     265                 :            : 
     266                 :          0 : bool QueueInfo::operator==( const QueueInfo& rInfo ) const
     267                 :            : {
     268                 :            :     return
     269                 :          0 :         maPrinterName   == rInfo.maPrinterName  &&
     270                 :          0 :         maDriver        == rInfo.maDriver       &&
     271                 :          0 :         maLocation      == rInfo.maLocation     &&
     272                 :          0 :         maComment       == rInfo.maComment      &&
     273                 :            :         mnStatus        == rInfo.mnStatus       &&
     274 [ #  # ][ #  # ]:          0 :         mnJobs          == rInfo.mnJobs;
           [ #  #  #  #  
             #  #  #  # ]
     275                 :            : }
     276                 :            : 
     277                 :            : // -----------------------------------------------------------------------
     278                 :            : 
     279                 :          0 : SvStream& operator<<( SvStream& rOStream, const QueueInfo& rInfo )
     280                 :            : {
     281         [ #  # ]:          0 :     VersionCompat aCompat( rOStream, STREAM_WRITE, 1 );
     282                 :            : 
     283         [ #  # ]:          0 :     write_lenPrefixed_uInt8s_FromOUString<sal_uInt16>(rOStream, rInfo.maPrinterName, RTL_TEXTENCODING_UTF8);
     284         [ #  # ]:          0 :     write_lenPrefixed_uInt8s_FromOUString<sal_uInt16>(rOStream, rInfo.maDriver, RTL_TEXTENCODING_UTF8);
     285         [ #  # ]:          0 :     write_lenPrefixed_uInt8s_FromOUString<sal_uInt16>(rOStream, rInfo.maLocation, RTL_TEXTENCODING_UTF8);
     286         [ #  # ]:          0 :     write_lenPrefixed_uInt8s_FromOUString<sal_uInt16>(rOStream, rInfo.maComment, RTL_TEXTENCODING_UTF8);
     287         [ #  # ]:          0 :     rOStream << rInfo.mnStatus;
     288         [ #  # ]:          0 :     rOStream << rInfo.mnJobs;
     289                 :            : 
     290         [ #  # ]:          0 :     return rOStream;
     291                 :            : }
     292                 :            : 
     293                 :            : // -----------------------------------------------------------------------
     294                 :            : 
     295                 :          0 : SvStream& operator>>( SvStream& rIStream, QueueInfo& rInfo )
     296                 :            : {
     297         [ #  # ]:          0 :     VersionCompat aCompat( rIStream, STREAM_READ );
     298                 :            : 
     299         [ #  # ]:          0 :     rInfo.maPrinterName = read_lenPrefixed_uInt8s_ToOUString<sal_uInt16>(rIStream, RTL_TEXTENCODING_UTF8);
     300         [ #  # ]:          0 :     rInfo.maDriver = read_lenPrefixed_uInt8s_ToOUString<sal_uInt16>(rIStream, RTL_TEXTENCODING_UTF8);
     301         [ #  # ]:          0 :     rInfo.maLocation = read_lenPrefixed_uInt8s_ToOUString<sal_uInt16>(rIStream, RTL_TEXTENCODING_UTF8);
     302         [ #  # ]:          0 :     rInfo.maComment = read_lenPrefixed_uInt8s_ToOUString<sal_uInt16>(rIStream, RTL_TEXTENCODING_UTF8);
     303         [ #  # ]:          0 :     rIStream >> rInfo.mnStatus;
     304         [ #  # ]:          0 :     rIStream >> rInfo.mnJobs;
     305                 :            : 
     306         [ #  # ]:          0 :     return rIStream;
     307                 :            : }
     308                 :            : 
     309                 :            : // =======================================================================
     310                 :            : 
     311                 :         12 : SalPrinterQueueInfo::SalPrinterQueueInfo()
     312                 :            : {
     313                 :         12 :     mnStatus    = 0;
     314                 :         12 :     mnJobs      = QUEUE_JOBS_DONTKNOW;
     315                 :         12 :     mpSysData   = NULL;
     316                 :         12 : }
     317                 :            : 
     318                 :            : // -----------------------------------------------------------------------
     319                 :            : 
     320                 :         12 : SalPrinterQueueInfo::~SalPrinterQueueInfo()
     321                 :            : {
     322                 :         12 : }
     323                 :            : 
     324                 :            : // -----------------------------------------------------------------------
     325                 :            : 
     326                 :         12 : ImplPrnQueueList::~ImplPrnQueueList()
     327                 :            : {
     328         [ +  - ]:         12 :     ImplSVData*         pSVData = ImplGetSVData();
     329         [ +  + ]:         24 :     for( unsigned int i = 0; i < m_aQueueInfos.size(); i++ )
     330                 :            :     {
     331 [ -  + ][ #  # ]:         12 :         delete m_aQueueInfos[i].mpQueueInfo;
     332         [ +  - ]:         12 :         pSVData->mpDefInst->DeletePrinterQueueInfo( m_aQueueInfos[i].mpSalQueueInfo );
     333                 :            :     }
     334                 :         12 : }
     335                 :            : 
     336                 :            : // -----------------------------------------------------------------------
     337                 :            : 
     338                 :         12 : void ImplPrnQueueList::Add( SalPrinterQueueInfo* pData )
     339                 :            : {
     340                 :            :     boost::unordered_map< rtl::OUString, sal_Int32, rtl::OUStringHash >::iterator it =
     341         [ +  - ]:         12 :         m_aNameToIndex.find( pData->maPrinterName );
     342 [ +  - ][ +  - ]:         12 :     if( it == m_aNameToIndex.end() )
     343                 :            :     {
     344         [ +  - ]:         12 :         m_aNameToIndex[ pData->maPrinterName ] = m_aQueueInfos.size();
     345         [ +  - ]:         12 :         m_aQueueInfos.push_back( ImplPrnQueueData() );
     346         [ +  - ]:         12 :         m_aQueueInfos.back().mpQueueInfo = NULL;
     347         [ +  - ]:         12 :         m_aQueueInfos.back().mpSalQueueInfo = pData;
     348         [ +  - ]:         12 :         m_aPrinterList.push_back( pData->maPrinterName );
     349                 :            :     }
     350                 :            :     else // this should not happen, but ...
     351                 :            :     {
     352         [ #  # ]:          0 :         ImplPrnQueueData& rData = m_aQueueInfos[ it->second ];
     353 [ #  # ][ #  # ]:          0 :         delete rData.mpQueueInfo;
     354                 :          0 :         rData.mpQueueInfo = NULL;
     355 [ #  # ][ #  # ]:          0 :         ImplGetSVData()->mpDefInst->DeletePrinterQueueInfo( rData.mpSalQueueInfo );
     356                 :          0 :         rData.mpSalQueueInfo = pData;
     357                 :            :     }
     358                 :         12 : }
     359                 :            : 
     360                 :            : // -----------------------------------------------------------------------
     361                 :            : 
     362                 :        124 : ImplPrnQueueData* ImplPrnQueueList::Get( const rtl::OUString& rPrinter )
     363                 :            : {
     364                 :        124 :     ImplPrnQueueData* pData = NULL;
     365                 :            :     boost::unordered_map<rtl::OUString,sal_Int32,rtl::OUStringHash>::iterator it =
     366         [ +  - ]:        124 :         m_aNameToIndex.find( rPrinter );
     367 [ +  - ][ +  + ]:        124 :     if( it != m_aNameToIndex.end() )
     368         [ +  - ]:        109 :         pData = &m_aQueueInfos[it->second];
     369                 :        124 :     return pData;
     370                 :            : }
     371                 :            : 
     372                 :            : // =======================================================================
     373                 :            : 
     374                 :         32 : static void ImplInitPrnQueueList()
     375                 :            : {
     376                 :         32 :     ImplSVData* pSVData = ImplGetSVData();
     377                 :            : 
     378         [ +  - ]:         32 :     pSVData->maGDIData.mpPrinterQueueList = new ImplPrnQueueList;
     379                 :            : 
     380 [ +  - ][ +  - ]:         32 :     static const char* pEnv = getenv( "SAL_DISABLE_PRINTERLIST" );
     381 [ -  + ][ #  # ]:         32 :     if( !pEnv || !*pEnv )
     382                 :         32 :         pSVData->mpDefInst->GetPrinterQueueInfo( pSVData->maGDIData.mpPrinterQueueList );
     383                 :         32 : }
     384                 :            : 
     385                 :            : // -----------------------------------------------------------------------
     386                 :            : 
     387                 :        158 : void ImplDeletePrnQueueList()
     388                 :            : {
     389                 :        158 :     ImplSVData*         pSVData = ImplGetSVData();
     390                 :        158 :     ImplPrnQueueList*   pPrnList = pSVData->maGDIData.mpPrinterQueueList;
     391                 :            : 
     392         [ +  + ]:        158 :     if ( pPrnList )
     393                 :            :     {
     394         [ +  - ]:         12 :         delete pPrnList;
     395                 :         12 :         pSVData->maGDIData.mpPrinterQueueList = NULL;
     396                 :            :     }
     397                 :        158 : }
     398                 :            : 
     399                 :            : // -----------------------------------------------------------------------
     400                 :            : 
     401                 :          0 : const std::vector<rtl::OUString>& Printer::GetPrinterQueues()
     402                 :            : {
     403                 :          0 :     ImplSVData*         pSVData = ImplGetSVData();
     404         [ #  # ]:          0 :     if ( !pSVData->maGDIData.mpPrinterQueueList )
     405                 :          0 :         ImplInitPrnQueueList();
     406                 :          0 :     return pSVData->maGDIData.mpPrinterQueueList->m_aPrinterList;
     407                 :            : }
     408                 :            : 
     409                 :            : // -----------------------------------------------------------------------
     410                 :          0 : const QueueInfo* Printer::GetQueueInfo( const rtl::OUString& rPrinterName, bool bStatusUpdate )
     411                 :            : {
     412                 :          0 :     ImplSVData* pSVData = ImplGetSVData();
     413                 :            : 
     414         [ #  # ]:          0 :     if ( !pSVData->maGDIData.mpPrinterQueueList )
     415                 :          0 :         ImplInitPrnQueueList();
     416                 :            : 
     417                 :          0 :     ImplPrnQueueData* pInfo = pSVData->maGDIData.mpPrinterQueueList->Get( rPrinterName );
     418         [ #  # ]:          0 :     if( pInfo )
     419                 :            :     {
     420 [ #  # ][ #  # ]:          0 :         if( !pInfo->mpQueueInfo || bStatusUpdate )
     421                 :          0 :             pSVData->mpDefInst->GetPrinterQueueState( pInfo->mpSalQueueInfo );
     422                 :            : 
     423         [ #  # ]:          0 :         if ( !pInfo->mpQueueInfo )
     424         [ #  # ]:          0 :             pInfo->mpQueueInfo = new QueueInfo;
     425                 :            : 
     426                 :          0 :         pInfo->mpQueueInfo->maPrinterName   = pInfo->mpSalQueueInfo->maPrinterName;
     427                 :          0 :         pInfo->mpQueueInfo->maDriver        = pInfo->mpSalQueueInfo->maDriver;
     428                 :          0 :         pInfo->mpQueueInfo->maLocation      = pInfo->mpSalQueueInfo->maLocation;
     429                 :          0 :         pInfo->mpQueueInfo->maComment       = pInfo->mpSalQueueInfo->maComment;
     430                 :          0 :         pInfo->mpQueueInfo->mnStatus        = pInfo->mpSalQueueInfo->mnStatus;
     431                 :          0 :         pInfo->mpQueueInfo->mnJobs          = pInfo->mpSalQueueInfo->mnJobs;
     432                 :          0 :         return pInfo->mpQueueInfo;
     433                 :            :     }
     434                 :          0 :     return NULL;
     435                 :            : }
     436                 :            : 
     437                 :            : // -----------------------------------------------------------------------
     438                 :            : 
     439                 :       3506 : rtl::OUString Printer::GetDefaultPrinterName()
     440                 :            : {
     441 [ +  + ][ +  - ]:       3506 :     static const char* pEnv = getenv( "SAL_DISABLE_DEFAULTPRINTER" );
     442 [ -  + ][ #  # ]:       3506 :     if( !pEnv || !*pEnv )
     443                 :            :     {
     444                 :       3506 :         ImplSVData* pSVData = ImplGetSVData();
     445                 :            : 
     446                 :       3506 :         return pSVData->mpDefInst->GetDefaultPrinter();
     447                 :            :     }
     448                 :       3506 :     return rtl::OUString();
     449                 :            : }
     450                 :            : 
     451                 :            : // =======================================================================
     452                 :            : 
     453                 :        243 : void Printer::ImplInitData()
     454                 :            : {
     455                 :        243 :     mbDevOutput         = sal_False;
     456                 :        243 :     meOutDevType        = OUTDEV_PRINTER;
     457                 :        243 :     mbDefPrinter        = sal_False;
     458                 :        243 :     mnError             = 0;
     459                 :        243 :     mnCurPage           = 0;
     460                 :        243 :     mnCurPrintPage      = 0;
     461                 :        243 :     mnPageQueueSize     = 0;
     462                 :        243 :     mnCopyCount         = 1;
     463                 :        243 :     mbCollateCopy       = sal_False;
     464                 :        243 :     mbPrinting          = sal_False;
     465                 :        243 :     mbJobActive         = sal_False;
     466                 :        243 :     mbPrintFile         = sal_False;
     467                 :        243 :     mbInPrintPage       = sal_False;
     468                 :        243 :     mbNewJobSetup       = sal_False;
     469                 :        243 :     mpInfoPrinter       = NULL;
     470                 :        243 :     mpPrinter           = NULL;
     471                 :        243 :     mpDisplayDev        = NULL;
     472                 :        243 :     mbIsQueuePrinter    = sal_False;
     473         [ +  - ]:        243 :     mpPrinterOptions    = new PrinterOptions;
     474                 :            : 
     475                 :            :     // Printer in die Liste eintragen
     476                 :        243 :     ImplSVData* pSVData = ImplGetSVData();
     477                 :        243 :     mpNext = pSVData->maGDIData.mpFirstPrinter;
     478                 :        243 :     mpPrev = NULL;
     479         [ +  + ]:        243 :     if ( mpNext )
     480                 :         27 :         mpNext->mpPrev = this;
     481                 :            :     else
     482                 :        216 :         pSVData->maGDIData.mpLastPrinter = this;
     483                 :        243 :     pSVData->maGDIData.mpFirstPrinter = this;
     484                 :        243 : }
     485                 :            : 
     486                 :            : // -----------------------------------------------------------------------
     487                 :            : 
     488                 :        109 : void Printer::ImplInit( SalPrinterQueueInfo* pInfo )
     489                 :            : {
     490                 :        109 :     ImplSVData* pSVData = ImplGetSVData();
     491                 :            :     // #i74084# update info for this specific SalPrinterQueueInfo
     492                 :        109 :     pSVData->mpDefInst->GetPrinterQueueState( pInfo );
     493                 :            : 
     494                 :            :     // Testen, ob Treiber ueberhaupt mit dem JobSetup uebereinstimmt
     495                 :        109 :     ImplJobSetup* pJobSetup = maJobSetup.ImplGetData();
     496                 :            : 
     497         [ -  + ]:        109 :     if ( pJobSetup->mpDriverData )
     498                 :            :     {
     499   [ #  #  #  # ]:          0 :         if ( (pJobSetup->maPrinterName != pInfo->maPrinterName) ||
                 [ #  # ]
     500                 :          0 :              (pJobSetup->maDriver != pInfo->maDriver) )
     501                 :            :         {
     502                 :          0 :             rtl_freeMemory( pJobSetup->mpDriverData );
     503                 :          0 :             pJobSetup->mpDriverData = NULL;
     504                 :          0 :             pJobSetup->mnDriverDataLen = 0;
     505                 :            :         }
     506                 :            :     }
     507                 :            : 
     508                 :            :     // Printernamen merken
     509                 :        109 :     maPrinterName = pInfo->maPrinterName;
     510                 :        109 :     maDriver = pInfo->maDriver;
     511                 :            : 
     512                 :            :     // In JobSetup den Printernamen eintragen
     513                 :        109 :     pJobSetup->maPrinterName = maPrinterName;
     514                 :        109 :     pJobSetup->maDriver = maDriver;
     515                 :            : 
     516                 :        109 :     mpInfoPrinter   = pSVData->mpDefInst->CreateInfoPrinter( pInfo, pJobSetup );
     517                 :        109 :     mpPrinter       = NULL;
     518                 :        109 :     mpJobGraphics   = NULL;
     519                 :        109 :     ImplUpdateJobSetupPaper( maJobSetup );
     520                 :            : 
     521         [ -  + ]:        109 :     if ( !mpInfoPrinter )
     522                 :            :     {
     523                 :          0 :         ImplInitDisplay( NULL );
     524                 :          0 :         return;
     525                 :            :     }
     526                 :            : 
     527                 :            :     // we need a graphics
     528         [ -  + ]:        109 :     if ( !ImplGetGraphics() )
     529                 :            :     {
     530                 :          0 :         ImplInitDisplay( NULL );
     531                 :          0 :         return;
     532                 :            :     }
     533                 :            : 
     534                 :            :     // Daten initialisieren
     535                 :        109 :     ImplUpdatePageData();
     536         [ +  - ]:        109 :     mpFontList = new ImplDevFontList();
     537         [ +  - ]:        109 :     mpFontCache = new ImplFontCache( sal_True );
     538                 :        109 :     mpGraphics->GetDevFontList( mpFontList );
     539                 :            : }
     540                 :            : 
     541                 :            : // -----------------------------------------------------------------------
     542                 :            : 
     543                 :        134 : void Printer::ImplInitDisplay( const Window* pWindow )
     544                 :            : {
     545                 :        134 :     ImplSVData* pSVData = ImplGetSVData();
     546                 :            : 
     547                 :        134 :     mpInfoPrinter       = NULL;
     548                 :        134 :     mpPrinter           = NULL;
     549                 :        134 :     mpJobGraphics       = NULL;
     550                 :            : 
     551         [ -  + ]:        134 :     if ( pWindow )
     552         [ #  # ]:          0 :         mpDisplayDev = new VirtualDevice( *pWindow );
     553                 :            :     else
     554         [ +  - ]:        134 :         mpDisplayDev = new VirtualDevice();
     555                 :        134 :     mpFontList          = pSVData->maGDIData.mpScreenFontList;
     556                 :        134 :     mpFontCache         = pSVData->maGDIData.mpScreenFontCache;
     557                 :        134 :     mnDPIX              = mpDisplayDev->mnDPIX;
     558                 :        134 :     mnDPIY              = mpDisplayDev->mnDPIY;
     559                 :        134 : }
     560                 :            : 
     561                 :            : // -----------------------------------------------------------------------
     562                 :            : 
     563                 :        243 : SalPrinterQueueInfo* Printer::ImplGetQueueInfo( const rtl::OUString& rPrinterName,
     564                 :            :                                                 const rtl::OUString* pDriver )
     565                 :            : {
     566                 :        243 :     ImplSVData* pSVData = ImplGetSVData();
     567         [ +  + ]:        243 :     if ( !pSVData->maGDIData.mpPrinterQueueList )
     568                 :         32 :         ImplInitPrnQueueList();
     569                 :            : 
     570                 :        243 :     ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList;
     571 [ +  - ][ +  + ]:        243 :     if ( pPrnList && pPrnList->m_aQueueInfos.size() )
                 [ +  + ]
     572                 :            :     {
     573                 :            :         // first search for the printer name driectly
     574                 :        109 :         ImplPrnQueueData* pInfo = pPrnList->Get( rPrinterName );
     575         [ +  + ]:        109 :         if( pInfo )
     576                 :         94 :             return pInfo->mpSalQueueInfo;
     577                 :            : 
     578                 :            :         // then search case insensitive
     579         [ +  + ]:         30 :         for( unsigned int i = 0; i < pPrnList->m_aQueueInfos.size(); i++ )
     580                 :            :         {
     581         [ -  + ]:         15 :             if( pPrnList->m_aQueueInfos[i].mpSalQueueInfo->maPrinterName.equalsIgnoreAsciiCase( rPrinterName ) )
     582                 :          0 :                 return pPrnList->m_aQueueInfos[i].mpSalQueueInfo;
     583                 :            :         }
     584                 :            : 
     585                 :            :         // then search for driver name
     586         [ -  + ]:         15 :         if ( pDriver )
     587                 :            :         {
     588         [ #  # ]:          0 :             for( unsigned int i = 0; i < pPrnList->m_aQueueInfos.size(); i++ )
     589                 :            :             {
     590         [ #  # ]:          0 :                 if( pPrnList->m_aQueueInfos[i].mpSalQueueInfo->maDriver == *pDriver )
     591                 :          0 :                     return pPrnList->m_aQueueInfos[i].mpSalQueueInfo;
     592                 :            :             }
     593                 :            :         }
     594                 :            : 
     595                 :            :         // then the default printer
     596         [ +  - ]:         15 :         pInfo = pPrnList->Get( GetDefaultPrinterName() );
     597         [ +  - ]:         15 :         if( pInfo )
     598                 :         15 :             return pInfo->mpSalQueueInfo;
     599                 :            : 
     600                 :            :         // last chance: the first available printer
     601                 :          0 :         return pPrnList->m_aQueueInfos[0].mpSalQueueInfo;
     602                 :            :     }
     603                 :            : 
     604                 :        243 :     return NULL;
     605                 :            : }
     606                 :            : 
     607                 :            : // -----------------------------------------------------------------------
     608                 :            : 
     609                 :        112 : void Printer::ImplUpdatePageData()
     610                 :            : {
     611                 :            :     // we need a graphics
     612         [ -  + ]:        112 :     if ( !ImplGetGraphics() )
     613                 :        112 :         return;
     614                 :            : 
     615                 :        112 :     mpGraphics->GetResolution( mnDPIX, mnDPIY );
     616                 :        112 :     mpInfoPrinter->GetPageInfo( maJobSetup.ImplGetConstData(),
     617                 :            :                                 mnOutWidth, mnOutHeight,
     618                 :        112 :                                 maPageOffset.X(), maPageOffset.Y(),
     619                 :        224 :                                 maPaperSize.Width(), maPaperSize.Height() );
     620                 :            : }
     621                 :            : 
     622                 :            : // -----------------------------------------------------------------------
     623                 :            : 
     624                 :          3 : void Printer::ImplUpdateFontList()
     625                 :            : {
     626                 :          3 :     ImplUpdateFontData( sal_True );
     627                 :          3 : }
     628                 :            : 
     629                 :            : // -----------------------------------------------------------------------
     630                 :            : 
     631 [ +  - ][ +  - ]:        213 : Printer::Printer()
     632                 :            : {
     633         [ +  - ]:        213 :     ImplInitData();
     634 [ +  - ][ +  - ]:        213 :     SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( GetDefaultPrinterName(), NULL );
     635         [ +  + ]:        213 :     if ( pInfo )
     636                 :            :     {
     637         [ +  - ]:         91 :         ImplInit( pInfo );
     638         [ +  - ]:         91 :         if ( !IsDisplayPrinter() )
     639                 :         91 :             mbDefPrinter = sal_True;
     640                 :            :     }
     641                 :            :     else
     642         [ +  - ]:        122 :         ImplInitDisplay( NULL );
     643                 :        213 : }
     644                 :            : 
     645                 :            : // -----------------------------------------------------------------------
     646                 :            : 
     647                 :          0 : Printer::Printer( const JobSetup& rJobSetup ) :
     648 [ #  # ][ #  # ]:          0 :     maJobSetup( rJobSetup )
     649                 :            : {
     650         [ #  # ]:          0 :     ImplInitData();
     651                 :            :     SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rJobSetup.mpData->maPrinterName,
     652         [ #  # ]:          0 :                                                    &rJobSetup.mpData->maDriver );
     653         [ #  # ]:          0 :     if ( pInfo )
     654                 :            :     {
     655         [ #  # ]:          0 :         ImplInit( pInfo );
     656         [ #  # ]:          0 :         SetJobSetup( rJobSetup );
     657                 :            :     }
     658                 :            :     else
     659                 :            :     {
     660         [ #  # ]:          0 :         ImplInitDisplay( NULL );
     661 [ #  # ][ #  # ]:          0 :         maJobSetup = JobSetup();
                 [ #  # ]
     662                 :            :     }
     663                 :          0 : }
     664                 :            : 
     665                 :            : // -----------------------------------------------------------------------
     666                 :            : 
     667 [ #  # ][ #  # ]:          0 : Printer::Printer( const QueueInfo& rQueueInfo )
     668                 :            : {
     669         [ #  # ]:          0 :     ImplInitData();
     670                 :          0 :     SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rQueueInfo.GetPrinterName(),
     671         [ #  # ]:          0 :                                                    &rQueueInfo.GetDriver() );
     672         [ #  # ]:          0 :     if ( pInfo )
     673         [ #  # ]:          0 :         ImplInit( pInfo );
     674                 :            :     else
     675         [ #  # ]:          0 :         ImplInitDisplay( NULL );
     676                 :          0 : }
     677                 :            : 
     678                 :            : // -----------------------------------------------------------------------
     679                 :            : 
     680 [ +  - ][ +  - ]:         30 : Printer::Printer( const rtl::OUString& rPrinterName )
     681                 :            : {
     682         [ +  - ]:         30 :     ImplInitData();
     683         [ +  - ]:         30 :     SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rPrinterName, NULL );
     684         [ +  + ]:         30 :     if ( pInfo )
     685         [ +  - ]:         18 :         ImplInit( pInfo );
     686                 :            :     else
     687         [ +  - ]:         12 :         ImplInitDisplay( NULL );
     688                 :         30 : }
     689                 :            : 
     690                 :            : // -----------------------------------------------------------------------
     691                 :            : 
     692         [ +  - ]:        239 : Printer::~Printer()
     693                 :            : {
     694                 :            :     DBG_ASSERT( !IsPrinting(), "Printer::~Printer() - Job is printing" );
     695                 :            :     DBG_ASSERT( !IsJobActive(), "Printer::~Printer() - Job is active" );
     696                 :            : 
     697 [ +  - ][ +  - ]:        239 :     delete mpPrinterOptions;
     698                 :            : 
     699         [ +  - ]:        239 :     ImplReleaseGraphics();
     700         [ +  + ]:        239 :     if ( mpInfoPrinter )
     701 [ +  - ][ +  - ]:        107 :         ImplGetSVData()->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
     702         [ +  + ]:        239 :     if ( mpDisplayDev )
     703 [ +  - ][ +  - ]:        132 :         delete mpDisplayDev;
     704                 :            :     else
     705                 :            :     {
     706                 :            :         // OutputDevice-Dtor versucht das gleiche, deshalb muss hier
     707                 :            :         // der FontEntry auch auf NULL gesetzt werden
     708                 :            :         // TODO: consolidate duplicate cleanup by Printer and OutputDevice
     709         [ -  + ]:        107 :         if ( mpFontEntry )
     710                 :            :         {
     711         [ #  # ]:          0 :             mpFontCache->Release( mpFontEntry );
     712                 :          0 :             mpFontEntry = NULL;
     713                 :            :         }
     714         [ -  + ]:        107 :         if ( mpGetDevFontList )
     715                 :            :         {
     716         [ #  # ]:          0 :             delete mpGetDevFontList;
     717                 :          0 :             mpGetDevFontList = NULL;
     718                 :            :         }
     719         [ -  + ]:        107 :         if ( mpGetDevSizeList )
     720                 :            :         {
     721 [ #  # ][ #  # ]:          0 :             delete mpGetDevSizeList;
     722                 :          0 :             mpGetDevSizeList = NULL;
     723                 :            :         }
     724 [ +  - ][ +  - ]:        107 :         delete mpFontCache;
     725                 :        107 :         mpFontCache = NULL;
     726                 :            :         // font list deleted by OutputDevice dtor
     727                 :            :     }
     728                 :            : 
     729                 :            :     // Printer aus der Liste eintragen
     730         [ +  - ]:        239 :     ImplSVData* pSVData = ImplGetSVData();
     731         [ +  + ]:        239 :     if ( mpPrev )
     732                 :          6 :         mpPrev->mpNext = mpNext;
     733                 :            :     else
     734                 :        233 :         pSVData->maGDIData.mpFirstPrinter = mpNext;
     735         [ +  + ]:        239 :     if ( mpNext )
     736                 :         21 :         mpNext->mpPrev = mpPrev;
     737                 :            :     else
     738                 :        218 :         pSVData->maGDIData.mpLastPrinter = mpPrev;
     739         [ -  + ]:        239 : }
     740                 :            : 
     741                 :            : // -----------------------------------------------------------------------
     742                 :          5 : void Printer::Compat_OldPrinterMetrics( bool bSet )
     743                 :            : {
     744                 :            :     // propagate flag
     745         [ +  + ]:          5 :     if( mpInfoPrinter )
     746                 :          2 :         mpInfoPrinter->m_bCompatMetrics = bSet;
     747                 :            : 
     748                 :            :     // get new font data
     749                 :          5 :     ImplUpdateFontData( sal_True );
     750                 :          5 : }
     751                 :            : 
     752                 :            : // -----------------------------------------------------------------------
     753                 :            : 
     754                 :          0 : sal_uLong Printer::GetCapabilities( sal_uInt16 nType ) const
     755                 :            : {
     756         [ #  # ]:          0 :     if ( IsDisplayPrinter() )
     757                 :          0 :         return sal_False;
     758                 :            : 
     759         [ #  # ]:          0 :     if( mpInfoPrinter )
     760                 :          0 :         return mpInfoPrinter->GetCapabilities( maJobSetup.ImplGetConstData(), nType );
     761                 :            :     else
     762                 :          0 :         return sal_False;
     763                 :            : }
     764                 :            : 
     765                 :            : // -----------------------------------------------------------------------
     766                 :            : 
     767                 :          0 : sal_Bool Printer::HasSupport( PrinterSupport eFeature ) const
     768                 :            : {
     769   [ #  #  #  #  :          0 :     switch ( eFeature )
          #  #  #  #  #  
                      # ]
     770                 :            :     {
     771                 :            :         case SUPPORT_SET_ORIENTATION:
     772                 :          0 :             return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETORIENTATION );
     773                 :            :         case SUPPORT_SET_PAPERBIN:
     774                 :          0 :             return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPERBIN );
     775                 :            :         case SUPPORT_SET_PAPERSIZE:
     776                 :          0 :             return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPERSIZE );
     777                 :            :         case SUPPORT_SET_PAPER:
     778                 :          0 :             return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SETPAPER );
     779                 :            :         case SUPPORT_COPY:
     780                 :          0 :             return (GetCapabilities( PRINTER_CAPABILITIES_COPIES ) != 0);
     781                 :            :         case SUPPORT_COLLATECOPY:
     782                 :          0 :             return (GetCapabilities( PRINTER_CAPABILITIES_COLLATECOPIES ) != 0);
     783                 :            :         case SUPPORT_SETUPDIALOG:
     784                 :          0 :             return (sal_Bool)GetCapabilities( PRINTER_CAPABILITIES_SUPPORTDIALOG );
     785                 :            :         case SUPPORT_FAX:
     786                 :          0 :             return (sal_Bool) GetCapabilities( PRINTER_CAPABILITIES_FAX );
     787                 :            :         case SUPPORT_PDF:
     788                 :          0 :             return (sal_Bool) GetCapabilities( PRINTER_CAPABILITIES_PDF );
     789                 :            :     }
     790                 :            : 
     791                 :          0 :     return sal_True;
     792                 :            : }
     793                 :            : 
     794                 :            : // -----------------------------------------------------------------------
     795                 :            : 
     796                 :          3 : sal_Bool Printer::SetJobSetup( const JobSetup& rSetup )
     797                 :            : {
     798 [ +  - ][ -  + ]:          3 :     if ( IsDisplayPrinter() || mbInPrintPage )
                 [ -  + ]
     799                 :          0 :         return sal_False;
     800                 :            : 
     801         [ +  - ]:          3 :     JobSetup aJobSetup = rSetup;
     802                 :            : 
     803         [ +  - ]:          3 :     ImplReleaseGraphics();
     804 [ +  - ][ +  - ]:          3 :     if ( mpInfoPrinter->SetPrinterData( aJobSetup.ImplGetData() ) )
                 [ +  - ]
     805                 :            :     {
     806         [ +  - ]:          3 :         ImplUpdateJobSetupPaper( aJobSetup );
     807                 :          3 :         mbNewJobSetup = sal_True;
     808         [ +  - ]:          3 :         maJobSetup = aJobSetup;
     809         [ +  - ]:          3 :         ImplUpdatePageData();
     810         [ +  - ]:          3 :         ImplUpdateFontList();
     811                 :          3 :         return sal_True;
     812                 :            :     }
     813                 :            : 
     814         [ +  - ]:          3 :     return sal_False;
     815                 :            : }
     816                 :            : 
     817                 :            : // -----------------------------------------------------------------------
     818                 :            : 
     819                 :            : 
     820                 :          0 : sal_Bool Printer::Setup( Window* pWindow )
     821                 :            : {
     822         [ #  # ]:          0 :     if ( IsDisplayPrinter() )
     823                 :          0 :         return sal_False;
     824                 :            : 
     825 [ #  # ][ #  # ]:          0 :     if ( IsJobActive() || IsPrinting() )
                 [ #  # ]
     826                 :          0 :         return sal_False;
     827                 :            : 
     828         [ #  # ]:          0 :     JobSetup aJobSetup = maJobSetup;
     829                 :            :     SalFrame* pFrame;
     830         [ #  # ]:          0 :     if ( !pWindow )
     831         [ #  # ]:          0 :         pWindow = ImplGetDefaultWindow();
     832         [ #  # ]:          0 :     if( !pWindow )
     833                 :          0 :         return sal_False;
     834                 :            : 
     835         [ #  # ]:          0 :     pFrame = pWindow->ImplGetFrame();
     836         [ #  # ]:          0 :     ImplReleaseGraphics();
     837         [ #  # ]:          0 :     ImplSVData* pSVData = ImplGetSVData();
     838                 :          0 :     pSVData->maAppData.mnModalMode++;
     839                 :          0 :     nImplSysDialog++;
     840 [ #  # ][ #  # ]:          0 :     sal_Bool bSetup = mpInfoPrinter->Setup( pFrame, aJobSetup.ImplGetData() );
     841                 :          0 :     pSVData->maAppData.mnModalMode--;
     842                 :          0 :     nImplSysDialog--;
     843         [ #  # ]:          0 :     if ( bSetup )
     844                 :            :     {
     845         [ #  # ]:          0 :         ImplUpdateJobSetupPaper( aJobSetup );
     846                 :          0 :         mbNewJobSetup = sal_True;
     847         [ #  # ]:          0 :         maJobSetup = aJobSetup;
     848         [ #  # ]:          0 :         ImplUpdatePageData();
     849         [ #  # ]:          0 :         ImplUpdateFontList();
     850                 :          0 :         return sal_True;
     851                 :            :     }
     852         [ #  # ]:          0 :     return sal_False;
     853                 :            : }
     854                 :            : 
     855                 :            : // -----------------------------------------------------------------------
     856                 :            : 
     857                 :          0 : sal_Bool Printer::SetPrinterProps( const Printer* pPrinter )
     858                 :            : {
     859 [ #  # ][ #  # ]:          0 :     if ( IsJobActive() || IsPrinting() )
                 [ #  # ]
     860                 :          0 :         return sal_False;
     861                 :            : 
     862                 :          0 :     ImplSVData* pSVData = ImplGetSVData();
     863                 :            : 
     864                 :          0 :     mbDefPrinter        = pPrinter->mbDefPrinter;
     865                 :          0 :     maPrintFile         = pPrinter->maPrintFile;
     866                 :          0 :     mbPrintFile         = pPrinter->mbPrintFile;
     867                 :          0 :     mnCopyCount         = pPrinter->mnCopyCount;
     868                 :          0 :     mbCollateCopy       = pPrinter->mbCollateCopy;
     869                 :          0 :     mnPageQueueSize     = pPrinter->mnPageQueueSize;
     870                 :          0 :     *mpPrinterOptions   = *pPrinter->mpPrinterOptions;
     871                 :            : 
     872         [ #  # ]:          0 :     if ( pPrinter->IsDisplayPrinter() )
     873                 :            :     {
     874                 :            :         // Alten Printer zerstoeren
     875         [ #  # ]:          0 :         if ( !IsDisplayPrinter() )
     876                 :            :         {
     877                 :          0 :             ImplReleaseGraphics();
     878                 :          0 :             pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
     879         [ #  # ]:          0 :             if ( mpFontEntry )
     880                 :            :             {
     881                 :          0 :                 mpFontCache->Release( mpFontEntry );
     882                 :          0 :                 mpFontEntry = NULL;
     883                 :            :             }
     884         [ #  # ]:          0 :             if ( mpGetDevFontList )
     885                 :            :             {
     886         [ #  # ]:          0 :                 delete mpGetDevFontList;
     887                 :          0 :                 mpGetDevFontList = NULL;
     888                 :            :             }
     889         [ #  # ]:          0 :             if ( mpGetDevSizeList )
     890                 :            :             {
     891         [ #  # ]:          0 :                 delete mpGetDevSizeList;
     892                 :          0 :                 mpGetDevSizeList = NULL;
     893                 :            :             }
     894                 :            :             // clean up font list
     895         [ #  # ]:          0 :             delete mpFontCache;
     896         [ #  # ]:          0 :             delete mpFontList;
     897                 :          0 :             mpFontCache = NULL;
     898                 :          0 :             mpFontList = NULL;
     899                 :            : 
     900                 :          0 :             mbInitFont = sal_True;
     901                 :          0 :             mbNewFont = sal_True;
     902                 :          0 :             mpInfoPrinter = NULL;
     903                 :            :         }
     904                 :            : 
     905                 :            :         // Neuen Printer bauen
     906                 :          0 :         ImplInitDisplay( NULL );
     907                 :          0 :         return sal_True;
     908                 :            :     }
     909                 :            : 
     910                 :            :     // Alten Printer zerstoeren?
     911         [ #  # ]:          0 :     if ( GetName() != pPrinter->GetName() )
     912                 :            :     {
     913         [ #  # ]:          0 :         ImplReleaseGraphics();
     914         [ #  # ]:          0 :         if ( mpDisplayDev )
     915                 :            :         {
     916 [ #  # ][ #  # ]:          0 :             delete mpDisplayDev;
     917                 :          0 :             mpDisplayDev = NULL;
     918                 :            :         }
     919                 :            :         else
     920                 :            :         {
     921         [ #  # ]:          0 :             pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
     922                 :            : 
     923         [ #  # ]:          0 :             if ( mpFontEntry )
     924                 :            :             {
     925         [ #  # ]:          0 :                 mpFontCache->Release( mpFontEntry );
     926                 :          0 :                 mpFontEntry = NULL;
     927                 :            :             }
     928         [ #  # ]:          0 :             if ( mpGetDevFontList )
     929                 :            :             {
     930         [ #  # ]:          0 :                 delete mpGetDevFontList;
     931                 :          0 :                 mpGetDevFontList = NULL;
     932                 :            :             }
     933         [ #  # ]:          0 :             if ( mpGetDevSizeList )
     934                 :            :             {
     935 [ #  # ][ #  # ]:          0 :                 delete mpGetDevSizeList;
     936                 :          0 :                 mpGetDevSizeList = NULL;
     937                 :            :             }
     938 [ #  # ][ #  # ]:          0 :             delete mpFontCache;
     939 [ #  # ][ #  # ]:          0 :             delete mpFontList;
     940                 :          0 :             mpFontCache = NULL;
     941                 :          0 :             mpFontList = NULL;
     942                 :          0 :             mbInitFont = sal_True;
     943                 :          0 :             mbNewFont = sal_True;
     944                 :          0 :             mpInfoPrinter = NULL;
     945                 :            :         }
     946                 :            : 
     947                 :            :         // Neuen Printer bauen
     948                 :          0 :         rtl::OUString aDriver = pPrinter->GetDriverName();
     949         [ #  # ]:          0 :         SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( pPrinter->GetName(), &aDriver );
     950         [ #  # ]:          0 :         if ( pInfo )
     951                 :            :         {
     952         [ #  # ]:          0 :             ImplInit( pInfo );
     953         [ #  # ]:          0 :             SetJobSetup( pPrinter->GetJobSetup() );
     954                 :            :         }
     955                 :            :         else
     956         [ #  # ]:          0 :             ImplInitDisplay( NULL );
     957                 :            :     }
     958                 :            :     else
     959                 :          0 :         SetJobSetup( pPrinter->GetJobSetup() );
     960                 :            : 
     961                 :          0 :     return sal_False;
     962                 :            : }
     963                 :            : 
     964                 :            : // -----------------------------------------------------------------------
     965                 :            : 
     966                 :          0 : sal_Bool Printer::SetOrientation( Orientation eOrientation )
     967                 :            : {
     968         [ #  # ]:          0 :     if ( mbInPrintPage )
     969                 :          0 :         return sal_False;
     970                 :            : 
     971         [ #  # ]:          0 :     if ( maJobSetup.ImplGetConstData()->meOrientation != eOrientation )
     972                 :            :     {
     973         [ #  # ]:          0 :         JobSetup        aJobSetup = maJobSetup;
     974         [ #  # ]:          0 :         ImplJobSetup*   pSetupData = aJobSetup.ImplGetData();
     975                 :          0 :         pSetupData->meOrientation = eOrientation;
     976                 :            : 
     977         [ #  # ]:          0 :         if ( IsDisplayPrinter() )
     978                 :            :         {
     979                 :          0 :             mbNewJobSetup = sal_True;
     980         [ #  # ]:          0 :             maJobSetup = aJobSetup;
     981                 :          0 :             return sal_True;
     982                 :            :         }
     983                 :            : 
     984         [ #  # ]:          0 :         ImplReleaseGraphics();
     985 [ #  # ][ #  # ]:          0 :         if ( mpInfoPrinter->SetData( SAL_JOBSET_ORIENTATION, pSetupData ) )
     986                 :            :         {
     987         [ #  # ]:          0 :             ImplUpdateJobSetupPaper( aJobSetup );
     988                 :          0 :             mbNewJobSetup = sal_True;
     989         [ #  # ]:          0 :             maJobSetup = aJobSetup;
     990         [ #  # ]:          0 :             ImplUpdatePageData();
     991         [ #  # ]:          0 :             ImplUpdateFontList();
     992                 :          0 :             return sal_True;
     993                 :            :         }
     994                 :            :         else
     995         [ #  # ]:          0 :             return sal_False;
     996                 :            :     }
     997                 :            : 
     998                 :          0 :     return sal_True;
     999                 :            : }
    1000                 :            : 
    1001                 :            : // -----------------------------------------------------------------------
    1002                 :            : 
    1003                 :         25 : Orientation Printer::GetOrientation() const
    1004                 :            : {
    1005                 :         25 :     return maJobSetup.ImplGetConstData()->meOrientation;
    1006                 :            : }
    1007                 :            : 
    1008                 :            : // -----------------------------------------------------------------------
    1009                 :            : 
    1010                 :          0 : sal_Bool Printer::SetPaperBin( sal_uInt16 nPaperBin )
    1011                 :            : {
    1012         [ #  # ]:          0 :     if ( mbInPrintPage )
    1013                 :          0 :         return sal_False;
    1014                 :            : 
    1015   [ #  #  #  # ]:          0 :     if ( (maJobSetup.ImplGetConstData()->mnPaperBin != nPaperBin) &&
                 [ #  # ]
    1016                 :          0 :          (nPaperBin < GetPaperBinCount()) )
    1017                 :            :     {
    1018         [ #  # ]:          0 :         JobSetup        aJobSetup = maJobSetup;
    1019         [ #  # ]:          0 :         ImplJobSetup*   pSetupData = aJobSetup.ImplGetData();
    1020                 :          0 :         pSetupData->mnPaperBin = nPaperBin;
    1021                 :            : 
    1022         [ #  # ]:          0 :         if ( IsDisplayPrinter() )
    1023                 :            :         {
    1024                 :          0 :             mbNewJobSetup = sal_True;
    1025         [ #  # ]:          0 :             maJobSetup = aJobSetup;
    1026                 :          0 :             return sal_True;
    1027                 :            :         }
    1028                 :            : 
    1029         [ #  # ]:          0 :         ImplReleaseGraphics();
    1030 [ #  # ][ #  # ]:          0 :         if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERBIN, pSetupData ) )
    1031                 :            :         {
    1032         [ #  # ]:          0 :             ImplUpdateJobSetupPaper( aJobSetup );
    1033                 :          0 :             mbNewJobSetup = sal_True;
    1034         [ #  # ]:          0 :             maJobSetup = aJobSetup;
    1035         [ #  # ]:          0 :             ImplUpdatePageData();
    1036         [ #  # ]:          0 :             ImplUpdateFontList();
    1037                 :          0 :             return sal_True;
    1038                 :            :         }
    1039                 :            :         else
    1040         [ #  # ]:          0 :             return sal_False;
    1041                 :            :     }
    1042                 :            : 
    1043                 :          0 :     return sal_True;
    1044                 :            : }
    1045                 :            : 
    1046                 :            : // -----------------------------------------------------------------------
    1047                 :            : 
    1048                 :          0 : sal_uInt16 Printer::GetPaperBin() const
    1049                 :            : {
    1050                 :          0 :     return maJobSetup.ImplGetConstData()->mnPaperBin;
    1051                 :            : }
    1052                 :            : 
    1053                 :            : // -----------------------------------------------------------------------
    1054                 :            : 
    1055                 :            : // Map user paper format to a available printer paper formats
    1056                 :          0 : void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup, bool bMatchNearest )
    1057                 :            : {
    1058         [ #  # ]:          0 :     ImplJobSetup*   pSetupData = aJobSetup.ImplGetData();
    1059                 :            : 
    1060         [ #  # ]:          0 :     int     nLandscapeAngle = GetLandscapeAngle();
    1061         [ #  # ]:          0 :     int     nPaperCount     = GetPaperInfoCount();
    1062                 :          0 :     bool    bFound = false;
    1063                 :            : 
    1064         [ #  # ]:          0 :     PaperInfo aInfo(pSetupData->mnPaperWidth, pSetupData->mnPaperHeight);
    1065                 :            : 
    1066                 :            :     // Alle Papierformate vergleichen und ein passendes raussuchen
    1067         [ #  # ]:          0 :     for ( int i = 0; i < nPaperCount; i++ )
    1068                 :            :     {
    1069         [ #  # ]:          0 :         const PaperInfo& rPaperInfo = GetPaperInfo( i );
    1070                 :            : 
    1071 [ #  # ][ #  # ]:          0 :         if ( aInfo.sloppyEqual(rPaperInfo) )
    1072                 :            :         {
    1073                 :            :             pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(),
    1074         [ #  # ]:          0 :                                                             rPaperInfo.getHeight() );
    1075                 :          0 :             pSetupData->meOrientation = ORIENTATION_PORTRAIT;
    1076                 :          0 :             bFound = true;
    1077                 :          0 :             break;
    1078                 :            :         }
    1079                 :            :     }
    1080                 :            : 
    1081                 :            :     // If the printer supports landscape orientation, check paper sizes again
    1082                 :            :     // with landscape orientation. This is necessary as a printer driver provides
    1083                 :            :     // all paper sizes with portrait orientation only!!
    1084 [ #  # ][ #  # ]:          0 :     if ( pSetupData->mePaperFormat == PAPER_USER &&
         [ #  # ][ #  # ]
    1085                 :            :          nLandscapeAngle != 0 &&
    1086         [ #  # ]:          0 :          HasSupport( SUPPORT_SET_ORIENTATION ))
    1087                 :            :     {
    1088                 :            : 
    1089         [ #  # ]:          0 :         PaperInfo aRotatedInfo(pSetupData->mnPaperHeight, pSetupData->mnPaperWidth);
    1090                 :            : 
    1091         [ #  # ]:          0 :         for ( int i = 0; i < nPaperCount; i++ )
    1092                 :            :         {
    1093         [ #  # ]:          0 :             const PaperInfo& rPaperInfo = GetPaperInfo( i );
    1094                 :            : 
    1095 [ #  # ][ #  # ]:          0 :             if ( aRotatedInfo.sloppyEqual( rPaperInfo ) )
    1096                 :            :             {
    1097                 :            :                 pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(),
    1098         [ #  # ]:          0 :                                                                 rPaperInfo.getHeight() );
    1099                 :          0 :                 pSetupData->meOrientation = ORIENTATION_LANDSCAPE;
    1100                 :          0 :                 bFound = true;
    1101                 :          0 :                 break;
    1102                 :            :             }
    1103                 :            :         }
    1104                 :            :     }
    1105                 :            : 
    1106 [ #  # ][ #  # ]:          0 :     if( ! bFound && bMatchNearest )
    1107                 :            :     {
    1108                 :          0 :          sal_Int64 nBestMatch = SAL_MAX_INT64;
    1109                 :          0 :          int nBestIndex = 0;
    1110                 :          0 :          Orientation eBestOrientation = ORIENTATION_PORTRAIT;
    1111         [ #  # ]:          0 :          for( int i = 0; i < nPaperCount; i++ )
    1112                 :            :          {
    1113         [ #  # ]:          0 :              const PaperInfo& rPaperInfo = GetPaperInfo( i );
    1114                 :            : 
    1115                 :            :              // check protrait match
    1116                 :          0 :              sal_Int64 nDX = pSetupData->mnPaperWidth - rPaperInfo.getWidth();
    1117                 :          0 :              sal_Int64 nDY = pSetupData->mnPaperHeight - rPaperInfo.getHeight();
    1118                 :          0 :              sal_Int64 nMatch = nDX*nDX + nDY*nDY;
    1119         [ #  # ]:          0 :              if( nMatch < nBestMatch )
    1120                 :            :              {
    1121                 :          0 :                  nBestMatch = nMatch;
    1122                 :          0 :                  nBestIndex = i;
    1123                 :          0 :                  eBestOrientation = ORIENTATION_PORTRAIT;
    1124                 :            :              }
    1125                 :            : 
    1126                 :            :              // check landscape match
    1127                 :          0 :              nDX = pSetupData->mnPaperWidth - rPaperInfo.getHeight();
    1128                 :          0 :              nDY = pSetupData->mnPaperHeight - rPaperInfo.getWidth();
    1129                 :          0 :              nMatch = nDX*nDX + nDY*nDY;
    1130         [ #  # ]:          0 :              if( nMatch < nBestMatch )
    1131                 :            :              {
    1132                 :          0 :                  nBestMatch = nMatch;
    1133                 :          0 :                  nBestIndex = i;
    1134                 :          0 :                  eBestOrientation = ORIENTATION_LANDSCAPE;
    1135                 :            :              }
    1136                 :            :          }
    1137         [ #  # ]:          0 :          const PaperInfo& rBestInfo = GetPaperInfo( nBestIndex );
    1138                 :            :          pSetupData->mePaperFormat = ImplGetPaperFormat( rBestInfo.getWidth(),
    1139         [ #  # ]:          0 :                                                          rBestInfo.getHeight() );
    1140                 :          0 :          pSetupData->meOrientation = eBestOrientation;
    1141                 :            :     }
    1142                 :          0 : }
    1143                 :            : 
    1144                 :            : // -----------------------------------------------------------------------
    1145                 :            : 
    1146                 :          0 : sal_Bool Printer::SetPaper( Paper ePaper )
    1147                 :            : {
    1148         [ #  # ]:          0 :     if ( mbInPrintPage )
    1149                 :          0 :         return sal_False;
    1150                 :            : 
    1151         [ #  # ]:          0 :     if ( maJobSetup.ImplGetConstData()->mePaperFormat != ePaper )
    1152                 :            :     {
    1153         [ #  # ]:          0 :         JobSetup        aJobSetup = maJobSetup;
    1154         [ #  # ]:          0 :         ImplJobSetup*   pSetupData = aJobSetup.ImplGetData();
    1155                 :          0 :         pSetupData->mePaperFormat = ePaper;
    1156         [ #  # ]:          0 :         if ( ePaper != PAPER_USER )
    1157                 :            :         {
    1158         [ #  # ]:          0 :             PaperInfo aInfo(ePaper);
    1159                 :          0 :             pSetupData->mnPaperWidth  = aInfo.getWidth();
    1160                 :          0 :             pSetupData->mnPaperHeight = aInfo.getHeight();
    1161                 :            :         }
    1162                 :            : 
    1163         [ #  # ]:          0 :         if ( IsDisplayPrinter() )
    1164                 :            :         {
    1165                 :          0 :             mbNewJobSetup = sal_True;
    1166         [ #  # ]:          0 :             maJobSetup = aJobSetup;
    1167                 :          0 :             return sal_True;
    1168                 :            :         }
    1169                 :            : 
    1170         [ #  # ]:          0 :         ImplReleaseGraphics();
    1171         [ #  # ]:          0 :         if ( ePaper == PAPER_USER )
    1172         [ #  # ]:          0 :             ImplFindPaperFormatForUserSize( aJobSetup, false );
    1173 [ #  # ][ #  # ]:          0 :         if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE|SAL_JOBSET_ORIENTATION, pSetupData ) )
    1174                 :            :         {
    1175         [ #  # ]:          0 :             ImplUpdateJobSetupPaper( aJobSetup );
    1176                 :          0 :             mbNewJobSetup = sal_True;
    1177         [ #  # ]:          0 :             maJobSetup = aJobSetup;
    1178         [ #  # ]:          0 :             ImplUpdatePageData();
    1179         [ #  # ]:          0 :             ImplUpdateFontList();
    1180                 :          0 :             return sal_True;
    1181                 :            :         }
    1182                 :            :         else
    1183         [ #  # ]:          0 :             return sal_False;
    1184                 :            :     }
    1185                 :            : 
    1186                 :          0 :     return sal_True;
    1187                 :            : }
    1188                 :            : 
    1189                 :            : // -----------------------------------------------------------------------
    1190                 :            : 
    1191                 :          0 : sal_Bool Printer::SetPaperSizeUser( const Size& rSize )
    1192                 :            : {
    1193                 :          0 :     return SetPaperSizeUser( rSize, false );
    1194                 :            : }
    1195                 :            : 
    1196                 :          0 : sal_Bool Printer::SetPaperSizeUser( const Size& rSize, bool bMatchNearest )
    1197                 :            : {
    1198         [ #  # ]:          0 :     if ( mbInPrintPage )
    1199                 :          0 :         return sal_False;
    1200                 :            : 
    1201         [ #  # ]:          0 :     Size    aPixSize = LogicToPixel( rSize );
    1202 [ #  # ][ #  # ]:          0 :     Size    aPageSize = PixelToLogic( aPixSize, MAP_100TH_MM );
                 [ #  # ]
    1203 [ #  # ][ #  #  :          0 :     if ( (maJobSetup.ImplGetConstData()->mePaperFormat != PAPER_USER)       ||
             #  #  #  # ]
                 [ #  # ]
    1204         [ #  # ]:          0 :          (maJobSetup.ImplGetConstData()->mnPaperWidth  != aPageSize.Width()) ||
    1205         [ #  # ]:          0 :          (maJobSetup.ImplGetConstData()->mnPaperHeight != aPageSize.Height()) )
    1206                 :            :     {
    1207         [ #  # ]:          0 :         JobSetup        aJobSetup = maJobSetup;
    1208         [ #  # ]:          0 :         ImplJobSetup*   pSetupData = aJobSetup.ImplGetData();
    1209                 :          0 :         pSetupData->mePaperFormat   = PAPER_USER;
    1210                 :          0 :         pSetupData->mnPaperWidth    = aPageSize.Width();
    1211                 :          0 :         pSetupData->mnPaperHeight   = aPageSize.Height();
    1212                 :            : 
    1213         [ #  # ]:          0 :         if ( IsDisplayPrinter() )
    1214                 :            :         {
    1215                 :          0 :             mbNewJobSetup = sal_True;
    1216         [ #  # ]:          0 :             maJobSetup = aJobSetup;
    1217                 :          0 :             return sal_True;
    1218                 :            :         }
    1219                 :            : 
    1220         [ #  # ]:          0 :         ImplReleaseGraphics();
    1221         [ #  # ]:          0 :         ImplFindPaperFormatForUserSize( aJobSetup, bMatchNearest );
    1222                 :            : 
    1223                 :            :         // Changing the paper size can also change the orientation!
    1224 [ #  # ][ #  # ]:          0 :         if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE|SAL_JOBSET_ORIENTATION, pSetupData ) )
    1225                 :            :         {
    1226         [ #  # ]:          0 :             ImplUpdateJobSetupPaper( aJobSetup );
    1227                 :          0 :             mbNewJobSetup = sal_True;
    1228         [ #  # ]:          0 :             maJobSetup = aJobSetup;
    1229         [ #  # ]:          0 :             ImplUpdatePageData();
    1230         [ #  # ]:          0 :             ImplUpdateFontList();
    1231                 :          0 :             return sal_True;
    1232                 :            :         }
    1233                 :            :         else
    1234         [ #  # ]:          0 :             return sal_False;
    1235                 :            :     }
    1236                 :            : 
    1237                 :          0 :     return sal_True;
    1238                 :            : }
    1239                 :            : 
    1240                 :            : // -----------------------------------------------------------------------
    1241                 :            : 
    1242                 :          0 : int Printer::GetPaperInfoCount() const
    1243                 :            : {
    1244         [ #  # ]:          0 :     if( ! mpInfoPrinter )
    1245                 :          0 :         return 0;
    1246         [ #  # ]:          0 :     if( ! mpInfoPrinter->m_bPapersInit )
    1247                 :          0 :         mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
    1248                 :          0 :     return mpInfoPrinter->m_aPaperFormats.size();
    1249                 :            : }
    1250                 :            : 
    1251                 :            : // -----------------------------------------------------------------------
    1252                 :            : 
    1253                 :          0 : rtl::OUString Printer::GetPaperName( Paper ePaper )
    1254                 :            : {
    1255         [ #  # ]:          0 :     ImplSVData* pSVData = ImplGetSVData();
    1256         [ #  # ]:          0 :     if( ! pSVData->mpPaperNames )
    1257                 :            :     {
    1258 [ #  # ][ #  # ]:          0 :         pSVData->mpPaperNames = new boost::unordered_map< int, rtl::OUString >();
    1259 [ #  # ][ #  # ]:          0 :         if( ImplGetResMgr() )
    1260                 :            :         {
    1261 [ #  # ][ #  # ]:          0 :             ResStringArray aPaperStrings( VclResId( RID_STR_PAPERNAMES ) );
    1262                 :            :             static const int PaperIndex[] =
    1263                 :            :             {
    1264                 :            :                 PAPER_A0, PAPER_A1, PAPER_A2, PAPER_A3, PAPER_A4, PAPER_A5,
    1265                 :            :                 PAPER_B4_ISO, PAPER_B5_ISO, PAPER_LETTER, PAPER_LEGAL, PAPER_TABLOID,
    1266                 :            :                 PAPER_USER, PAPER_B6_ISO, PAPER_ENV_C4, PAPER_ENV_C5, PAPER_ENV_C6, PAPER_ENV_C65,
    1267                 :            :                 PAPER_ENV_DL, PAPER_SLIDE_DIA, PAPER_C, PAPER_D, PAPER_E,
    1268                 :            :                 PAPER_EXECUTIVE, PAPER_FANFOLD_LEGAL_DE, PAPER_ENV_MONARCH, PAPER_ENV_PERSONAL,
    1269                 :            :                 PAPER_ENV_9, PAPER_ENV_10, PAPER_ENV_11, PAPER_ENV_12, PAPER_KAI16,
    1270                 :            :                 PAPER_KAI32, PAPER_KAI32BIG, PAPER_B4_JIS, PAPER_B5_JIS, PAPER_B6_JIS,
    1271                 :            :                 PAPER_POSTCARD_JP
    1272                 :            :             };
    1273                 :            :             OSL_ENSURE( sal_uInt32(SAL_N_ELEMENTS(PaperIndex)) == aPaperStrings.Count(), "localized paper name count wrong" );
    1274         [ #  # ]:          0 :             for( int i = 0; i < int(SAL_N_ELEMENTS(PaperIndex)); i++ )
    1275 [ #  # ][ #  # ]:          0 :                 (*pSVData->mpPaperNames)[PaperIndex[i]] = aPaperStrings.GetString(i);
                 [ #  # ]
    1276                 :            :         }
    1277                 :            :     }
    1278                 :            : 
    1279         [ #  # ]:          0 :     boost::unordered_map<int,rtl::OUString>::const_iterator it = pSVData->mpPaperNames->find( (int)ePaper );
    1280 [ #  # ][ #  # ]:          0 :     return (it != pSVData->mpPaperNames->end()) ? it->second : rtl::OUString();
                 [ #  # ]
    1281                 :            : }
    1282                 :            : 
    1283                 :            : // -----------------------------------------------------------------------
    1284                 :            : 
    1285                 :          0 : rtl::OUString Printer::GetPaperName( bool i_bPaperUser ) const
    1286                 :            : {
    1287 [ #  # ][ #  # ]:          0 :     Size  aPageSize = PixelToLogic( GetPaperSizePixel(), MAP_100TH_MM );
                 [ #  # ]
    1288         [ #  # ]:          0 :     Paper ePaper    = ImplGetPaperFormat( aPageSize.Width(), aPageSize.Height() );
    1289         [ #  # ]:          0 :     if( ePaper == PAPER_USER )
    1290         [ #  # ]:          0 :         ePaper = ImplGetPaperFormat( aPageSize.Height(), aPageSize.Width() );
    1291 [ #  # ][ #  # ]:          0 :     return (ePaper != PAPER_USER || i_bPaperUser ) ? GetPaperName( ePaper ) : rtl::OUString();
                 [ #  # ]
    1292                 :            : }
    1293                 :            : 
    1294                 :            : // -----------------------------------------------------------------------
    1295                 :            : 
    1296                 :          0 : const PaperInfo& Printer::GetPaperInfo( int nPaper ) const
    1297                 :            : {
    1298         [ #  # ]:          0 :     if( ! mpInfoPrinter )
    1299                 :          0 :         return ImplGetEmptyPaper();
    1300         [ #  # ]:          0 :     if( ! mpInfoPrinter->m_bPapersInit )
    1301                 :          0 :         mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() );
    1302 [ #  # ][ #  # ]:          0 :     if( mpInfoPrinter->m_aPaperFormats.empty() || nPaper < 0 || nPaper >= int(mpInfoPrinter->m_aPaperFormats.size()) )
         [ #  # ][ #  # ]
    1303                 :          0 :         return ImplGetEmptyPaper();
    1304                 :          0 :     return mpInfoPrinter->m_aPaperFormats[nPaper];
    1305                 :            : }
    1306                 :            : 
    1307                 :            : // -----------------------------------------------------------------------
    1308                 :            : 
    1309                 :          0 : sal_Bool Printer::SetDuplexMode( DuplexMode eDuplex )
    1310                 :            : {
    1311         [ #  # ]:          0 :     if ( mbInPrintPage )
    1312                 :          0 :         return sal_False;
    1313                 :            : 
    1314         [ #  # ]:          0 :     if ( maJobSetup.ImplGetConstData()->meDuplexMode != eDuplex )
    1315                 :            :     {
    1316         [ #  # ]:          0 :         JobSetup        aJobSetup = maJobSetup;
    1317         [ #  # ]:          0 :         ImplJobSetup*   pSetupData = aJobSetup.ImplGetData();
    1318                 :          0 :         pSetupData->meDuplexMode = eDuplex;
    1319                 :            : 
    1320         [ #  # ]:          0 :         if ( IsDisplayPrinter() )
    1321                 :            :         {
    1322                 :          0 :             mbNewJobSetup = sal_True;
    1323         [ #  # ]:          0 :             maJobSetup = aJobSetup;
    1324                 :          0 :             return sal_True;
    1325                 :            :         }
    1326                 :            : 
    1327         [ #  # ]:          0 :         ImplReleaseGraphics();
    1328 [ #  # ][ #  # ]:          0 :         if ( mpInfoPrinter->SetData( SAL_JOBSET_DUPLEXMODE, pSetupData ) )
    1329                 :            :         {
    1330         [ #  # ]:          0 :             ImplUpdateJobSetupPaper( aJobSetup );
    1331                 :          0 :             mbNewJobSetup = sal_True;
    1332         [ #  # ]:          0 :             maJobSetup = aJobSetup;
    1333         [ #  # ]:          0 :             ImplUpdatePageData();
    1334         [ #  # ]:          0 :             ImplUpdateFontList();
    1335                 :          0 :             return sal_True;
    1336                 :            :         }
    1337                 :            :         else
    1338         [ #  # ]:          0 :             return sal_False;
    1339                 :            :     }
    1340                 :            : 
    1341                 :          0 :     return sal_True;
    1342                 :            : }
    1343                 :            : 
    1344                 :            : // -----------------------------------------------------------------------
    1345                 :            : 
    1346                 :          0 : int Printer::GetLandscapeAngle() const
    1347                 :            : {
    1348         [ #  # ]:          0 :     return mpInfoPrinter ? mpInfoPrinter->GetLandscapeAngle( maJobSetup.ImplGetConstData() ) : 900;
    1349                 :            : }
    1350                 :            : 
    1351                 :            : // -----------------------------------------------------------------------
    1352                 :            : 
    1353                 :         13 : Paper Printer::GetPaper() const
    1354                 :            : {
    1355                 :         13 :     return maJobSetup.ImplGetConstData()->mePaperFormat;
    1356                 :            : }
    1357                 :            : 
    1358                 :            : // -----------------------------------------------------------------------
    1359                 :            : 
    1360                 :          0 : sal_uInt16 Printer::GetPaperBinCount() const
    1361                 :            : {
    1362         [ #  # ]:          0 :     if ( IsDisplayPrinter() )
    1363                 :          0 :         return 0;
    1364                 :            : 
    1365                 :          0 :     return (sal_uInt16)mpInfoPrinter->GetPaperBinCount( maJobSetup.ImplGetConstData() );
    1366                 :            : }
    1367                 :            : 
    1368                 :            : // -----------------------------------------------------------------------
    1369                 :            : 
    1370                 :          0 : rtl::OUString Printer::GetPaperBinName( sal_uInt16 nPaperBin ) const
    1371                 :            : {
    1372         [ #  # ]:          0 :     if ( IsDisplayPrinter() )
    1373                 :          0 :         return ImplGetSVEmptyStr();
    1374                 :            : 
    1375         [ #  # ]:          0 :     if ( nPaperBin < GetPaperBinCount() )
    1376                 :          0 :         return mpInfoPrinter->GetPaperBinName( maJobSetup.ImplGetConstData(), nPaperBin );
    1377                 :            :     else
    1378                 :          0 :         return ImplGetSVEmptyStr();
    1379                 :            : }
    1380                 :            : 
    1381                 :            : // -----------------------------------------------------------------------
    1382                 :            : 
    1383                 :          0 : sal_Bool Printer::SetCopyCount( sal_uInt16 nCopy, sal_Bool bCollate )
    1384                 :            : {
    1385                 :          0 :     mnCopyCount = nCopy;
    1386                 :          0 :     mbCollateCopy = bCollate;
    1387                 :          0 :     return sal_True;
    1388                 :            : }
    1389                 :            : 
    1390                 :            : // -----------------------------------------------------------------------
    1391                 :            : 
    1392                 :          0 : void Printer::Error()
    1393                 :            : {
    1394                 :          0 :     maErrorHdl.Call( this );
    1395                 :          0 : }
    1396                 :            : 
    1397                 :            : // -----------------------------------------------------------------------
    1398                 :            : 
    1399                 :            : 
    1400                 :          0 : sal_uLong Printer::ImplSalPrinterErrorCodeToVCL( sal_uLong nError )
    1401                 :            : {
    1402                 :            :     sal_uLong nVCLError;
    1403      [ #  #  # ]:          0 :     switch ( nError )
    1404                 :            :     {
    1405                 :            :         case 0:
    1406                 :          0 :             nVCLError = PRINTER_OK;
    1407                 :          0 :             break;
    1408                 :            :         case SAL_PRINTER_ERROR_ABORT:
    1409                 :          0 :             nVCLError = PRINTER_ABORT;
    1410                 :          0 :             break;
    1411                 :            :         default:
    1412                 :          0 :             nVCLError = PRINTER_GENERALERROR;
    1413                 :          0 :             break;
    1414                 :            :     }
    1415                 :            : 
    1416                 :          0 :     return nVCLError;
    1417                 :            : }
    1418                 :            : 
    1419                 :            : // -----------------------------------------------------------------------
    1420                 :            : 
    1421                 :          0 : sal_Bool Printer::EndJob()
    1422                 :            : {
    1423                 :          0 :     sal_Bool bRet = sal_False;
    1424         [ #  # ]:          0 :     if ( !IsJobActive() )
    1425                 :          0 :         return bRet;
    1426                 :            : 
    1427                 :            :     DBG_ASSERT( !mbInPrintPage, "Printer::EndJob() - StartPage() without EndPage() called" );
    1428                 :            : 
    1429                 :          0 :     mbJobActive = sal_False;
    1430                 :            : 
    1431         [ #  # ]:          0 :     if ( mpPrinter )
    1432                 :            :     {
    1433                 :          0 :         ImplReleaseGraphics();
    1434                 :            : 
    1435                 :          0 :         mnCurPage = 0;
    1436                 :            : 
    1437                 :          0 :         bRet = sal_True;
    1438                 :            : 
    1439                 :          0 :         mbPrinting      = sal_False;
    1440                 :          0 :         mnCurPrintPage  = 0;
    1441                 :          0 :         maJobName = rtl::OUString();
    1442                 :            : 
    1443                 :          0 :         mbDevOutput = sal_False;
    1444                 :          0 :         bRet = mpPrinter->EndJob();
    1445                 :            :         // Hier den Drucker nicht asyncron zerstoeren, da es
    1446                 :            :         // W95 nicht verkraftet, wenn gleichzeitig gedruckt wird
    1447                 :            :         // und ein Druckerobjekt zerstoert wird
    1448                 :          0 :         ImplGetSVData()->mpDefInst->DestroyPrinter( mpPrinter );
    1449                 :          0 :         mpPrinter = NULL;
    1450                 :            :     }
    1451                 :            : 
    1452                 :          0 :     return bRet;
    1453                 :            : }
    1454                 :            : 
    1455                 :            : // -----------------------------------------------------------------------
    1456                 :            : 
    1457                 :          0 : void Printer::ImplStartPage()
    1458                 :            : {
    1459         [ #  # ]:          0 :     if ( !IsJobActive() )
    1460                 :          0 :         return;
    1461                 :            : 
    1462         [ #  # ]:          0 :     if ( mpPrinter )
    1463                 :            :     {
    1464                 :          0 :         SalGraphics* pGraphics = mpPrinter->StartPage( maJobSetup.ImplGetConstData(), mbNewJobSetup );
    1465         [ #  # ]:          0 :         if ( pGraphics )
    1466                 :            :         {
    1467                 :          0 :             ImplReleaseGraphics();
    1468                 :          0 :             mpJobGraphics = pGraphics;
    1469                 :            :         }
    1470                 :          0 :         mbDevOutput = sal_True;
    1471                 :            : 
    1472                 :            :         // PrintJob not aborted ???
    1473         [ #  # ]:          0 :         if ( IsJobActive() )
    1474                 :            :         {
    1475                 :          0 :             mbInPrintPage = sal_True;
    1476                 :          0 :             mnCurPage++;
    1477                 :          0 :             mnCurPrintPage++;
    1478                 :            :         }
    1479                 :            :     }
    1480                 :            : }
    1481                 :            : 
    1482                 :            : // -----------------------------------------------------------------------
    1483                 :            : 
    1484                 :          0 : void Printer::ImplEndPage()
    1485                 :            : {
    1486         [ #  # ]:          0 :     if ( !IsJobActive() )
    1487                 :          0 :         return;
    1488                 :            : 
    1489                 :          0 :     mbInPrintPage = sal_False;
    1490                 :            : 
    1491         [ #  # ]:          0 :     if ( mpPrinter )
    1492                 :            :     {
    1493                 :          0 :         mpPrinter->EndPage();
    1494                 :          0 :         ImplReleaseGraphics();
    1495                 :          0 :         mbDevOutput = sal_False;
    1496                 :            : 
    1497                 :          0 :         mpJobGraphics = NULL;
    1498                 :          0 :         mbNewJobSetup = sal_False;
    1499                 :            :     }
    1500                 :            : }
    1501                 :            : 
    1502                 :            : // -----------------------------------------------------------------------
    1503                 :            : 
    1504                 :          0 : void Printer::updatePrinters()
    1505                 :            : {
    1506                 :          0 :     ImplSVData*         pSVData = ImplGetSVData();
    1507                 :          0 :     ImplPrnQueueList*   pPrnList = pSVData->maGDIData.mpPrinterQueueList;
    1508                 :            : 
    1509         [ #  # ]:          0 :     if ( pPrnList )
    1510                 :            :     {
    1511         [ #  # ]:          0 :         ImplPrnQueueList* pNewList = new ImplPrnQueueList;
    1512                 :          0 :         pSVData->mpDefInst->GetPrinterQueueInfo( pNewList );
    1513                 :            : 
    1514                 :          0 :         bool bChanged = pPrnList->m_aQueueInfos.size() != pNewList->m_aQueueInfos.size();
    1515 [ #  # ][ #  # ]:          0 :         for( unsigned int i = 0; ! bChanged && i < pPrnList->m_aQueueInfos.size(); i++ )
                 [ #  # ]
    1516                 :            :         {
    1517                 :          0 :             ImplPrnQueueData& rInfo     = pPrnList->m_aQueueInfos[i];
    1518                 :          0 :             ImplPrnQueueData& rNewInfo  = pNewList->m_aQueueInfos[i];
    1519   [ #  #  #  # ]:          0 :             if( ! rInfo.mpSalQueueInfo || ! rNewInfo.mpSalQueueInfo || // sanity check
         [ #  # ][ #  # ]
    1520                 :          0 :                 rInfo.mpSalQueueInfo->maPrinterName != rNewInfo.mpSalQueueInfo->maPrinterName )
    1521                 :            :             {
    1522                 :          0 :                 bChanged = true;
    1523                 :            :             }
    1524                 :            :         }
    1525         [ #  # ]:          0 :         if( bChanged )
    1526                 :            :         {
    1527                 :          0 :             ImplDeletePrnQueueList();
    1528                 :          0 :             pSVData->maGDIData.mpPrinterQueueList = pNewList;
    1529                 :            : 
    1530                 :          0 :             Application* pApp = GetpApp();
    1531         [ #  # ]:          0 :             if( pApp )
    1532                 :            :             {
    1533         [ #  # ]:          0 :                 DataChangedEvent aDCEvt( DATACHANGED_PRINTER );
    1534         [ #  # ]:          0 :                 pApp->DataChanged( aDCEvt );
    1535         [ #  # ]:          0 :                 pApp->NotifyAllWindows( aDCEvt );
    1536                 :            :             }
    1537                 :            :         }
    1538                 :            :         else
    1539         [ #  # ]:          0 :             delete pNewList;
    1540                 :            :     }
    1541                 :          0 : }
    1542                 :            : 
    1543                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10