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: */
|