2230 lines
65 KiB
C++
2230 lines
65 KiB
C++
/*************************************************************************
|
||
*
|
||
* $RCSfile: print.cxx,v $
|
||
*
|
||
* $Revision: 1.22 $
|
||
*
|
||
* last change: $Author: hjs $ $Date: 2001-11-07 19:41:41 $
|
||
*
|
||
* The Contents of this file are made available subject to the terms of
|
||
* either of the following licenses
|
||
*
|
||
* - GNU Lesser General Public License Version 2.1
|
||
* - Sun Industry Standards Source License Version 1.1
|
||
*
|
||
* Sun Microsystems Inc., October, 2000
|
||
*
|
||
* GNU Lesser General Public License Version 2.1
|
||
* =============================================
|
||
* Copyright 2000 by Sun Microsystems, Inc.
|
||
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
||
*
|
||
* This library is free software; you can redistribute it and/or
|
||
* modify it under the terms of the GNU Lesser General Public
|
||
* License version 2.1, as published by the Free Software Foundation.
|
||
*
|
||
* This library is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
* Lesser General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with this library; if not, write to the Free Software
|
||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||
* MA 02111-1307 USA
|
||
*
|
||
*
|
||
* Sun Industry Standards Source License Version 1.1
|
||
* =================================================
|
||
* The contents of this file are subject to the Sun Industry Standards
|
||
* Source License Version 1.1 (the "License"); You may not use this file
|
||
* except in compliance with the License. You may obtain a copy of the
|
||
* License at http://www.openoffice.org/license.html.
|
||
*
|
||
* Software provided under this License is provided on an "AS IS" basis,
|
||
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
||
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
||
* See the License for the specific provisions governing your rights and
|
||
* obligations concerning the Software.
|
||
*
|
||
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
||
*
|
||
* Copyright: 2000 by Sun Microsystems, Inc.
|
||
*
|
||
* All Rights Reserved.
|
||
*
|
||
* Contributor(s): _______________________________________
|
||
*
|
||
*
|
||
************************************************************************/
|
||
|
||
#define _SV_PRINT_CXX
|
||
#define _SPOOLPRINTER_EXT
|
||
#define _RMPRINTER_EXT
|
||
#define ENABLE_BYTESTRING_STREAM_OPERATORS
|
||
#include <list>
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
|
||
#ifndef _SV_SVSYS_HXX
|
||
#include <svsys.h>
|
||
#endif
|
||
#ifndef _SV_SALINST_HXX
|
||
#include <salinst.hxx>
|
||
#endif
|
||
#ifndef _SV_SALGDI_HXX
|
||
#include <salgdi.hxx>
|
||
#endif
|
||
#ifndef _SV_SALPTYPE_HXX
|
||
#include <salptype.hxx>
|
||
#endif
|
||
#ifndef _SV_SALPRN_HXX
|
||
#include <salprn.hxx>
|
||
#endif
|
||
|
||
#include <unohelp.hxx>
|
||
|
||
|
||
#else
|
||
|
||
#include "rmoutdev.hxx"
|
||
#include "rmprint.hxx"
|
||
#include "rmwindow.hxx"
|
||
#include "rvp.hxx"
|
||
#include <vos/mutex.hxx>
|
||
#ifndef _VCL_UNOHELP_HXX
|
||
#include <unohelp.hxx>
|
||
#endif
|
||
|
||
struct SalPrinterQueueInfo
|
||
{
|
||
XubString maPrinterName;
|
||
XubString maDriver;
|
||
XubString maLocation;
|
||
XubString maComment;
|
||
ULONG mnStatus;
|
||
ULONG mnJobs;
|
||
void* mpSysData;
|
||
|
||
SalPrinterQueueInfo();
|
||
~SalPrinterQueueInfo();
|
||
};
|
||
|
||
#endif
|
||
|
||
#ifndef _DEBUG_HXX
|
||
#include <tools/debug.hxx>
|
||
#endif
|
||
#ifndef _STREAM_HXX
|
||
#include <tools/stream.hxx>
|
||
#endif
|
||
#ifndef _VCOMPAT_HXX
|
||
#include <tools/vcompat.hxx>
|
||
#endif
|
||
#ifndef _SV_SVDATA_HXX
|
||
#include <svdata.hxx>
|
||
#endif
|
||
#ifndef _SV_SVAPP_HXX
|
||
#include <svapp.hxx>
|
||
#endif
|
||
#ifndef _SV_WRKWIN_HXX
|
||
#include <wrkwin.hxx>
|
||
#endif
|
||
#ifndef _SV_JOBSET_H
|
||
#include <jobset.h>
|
||
#endif
|
||
#ifndef _SV_OUTDEV_H
|
||
#include <outdev.h>
|
||
#endif
|
||
#ifndef _SV_VIRDEV_HXX
|
||
#include <virdev.hxx>
|
||
#endif
|
||
#ifndef _SV_WINDOW_HXX
|
||
#include <window.hxx>
|
||
#endif
|
||
#ifndef _SV_PRINT_H
|
||
#include <print.h>
|
||
#endif
|
||
#ifndef _SV_GDIMTF_HXX
|
||
#include <gdimtf.hxx>
|
||
#endif
|
||
#ifndef _SV_METAACT_HXX
|
||
#include <metaact.hxx>
|
||
#endif
|
||
#ifndef _SV_IMPPRN_HXX
|
||
#include <impprn.hxx>
|
||
#endif
|
||
#ifndef _SV_PRINT_HXX
|
||
#include <print.hxx>
|
||
#endif
|
||
|
||
#include <comphelper/processfactory.hxx>
|
||
|
||
using namespace com::sun::star::uno;
|
||
using namespace com::sun::star::lang;
|
||
#ifdef DO_TAB_CHECK
|
||
#include <com/sun/star/beans/XMaterialHolder.hpp>
|
||
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
|
||
#include <com/sun/star/beans/NamedValue.hpp>
|
||
using namespace com::sun::star::beans;
|
||
|
||
static const char* pHead = "StarOffice 6.0";
|
||
static const char* pFoot = "sun.com/staroffice";
|
||
|
||
static const char* pLines[] =
|
||
{
|
||
"Evaluation Version",
|
||
"Testversion",
|
||
"Version d\'<EFBFBD>valuation",
|
||
"Versi<EFBFBD>n de prueba",
|
||
"Versione per valutazione"
|
||
};
|
||
|
||
static void doTab( Printer* pPrinter )
|
||
{
|
||
static bool bChecked = false;
|
||
static bool bDoTab = true;
|
||
static ::std::list<String> aLines;
|
||
if( ! bChecked )
|
||
{
|
||
bChecked = true;
|
||
for( int i = 0; i < sizeof(pLines)/sizeof(pLines[0]); i++ )
|
||
aLines.push_back( String( ByteString( pLines[i] ), RTL_TEXTENCODING_ISO_8859_1 ) );
|
||
try
|
||
{
|
||
Reference< XMultiServiceFactory > xFac( ::comphelper::getProcessServiceFactory() );
|
||
if( xFac.is() )
|
||
{
|
||
Reference< XMaterialHolder > xHolder( xFac->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.tab.tabreg" ) ) ), UNO_QUERY );
|
||
if( xHolder.is() )
|
||
{
|
||
Any aMaterial( xHolder->getMaterial() );
|
||
aLines.clear();
|
||
bDoTab = aMaterial.hasValue();
|
||
if( bDoTab )
|
||
{
|
||
Sequence< NamedValue > aSeq;
|
||
aMaterial >>= aSeq;
|
||
for( int i = 0; i < aSeq.getLength(); i++ )
|
||
{
|
||
::rtl::OUString aL;
|
||
aSeq[i].Value >>= aL;
|
||
String aLine( aL );
|
||
if( aLine.Len() )
|
||
{
|
||
::std::list<String>::const_iterator it;
|
||
for( it = aLines.begin(); it != aLines.end() && ! (*it).Equals( aLine ); ++it )
|
||
;
|
||
if( it == aLines.end() )
|
||
aLines.push_back( aLine );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch(...)
|
||
{
|
||
}
|
||
}
|
||
if( bDoTab )
|
||
{
|
||
pPrinter->Push( PUSH_ALL );
|
||
|
||
pPrinter->SetMapMode( MapMode( MAP_10TH_MM ) );
|
||
pPrinter->SetTextColor( Color( COL_BLACK ) );
|
||
pPrinter->SetLineColor( Color( COL_BLACK ) );
|
||
pPrinter->SetFillColor( Color( COL_WHITE ) );
|
||
|
||
Size aPaperSize( pPrinter->GetOutputSize() );
|
||
Font aNormalFont( String( RTL_CONSTASCII_USTRINGPARAM( "Helvetica" ) ), Size( 0, 40 ) );
|
||
Font aBigBoldFont( String( RTL_CONSTASCII_USTRINGPARAM( "Helvetica" ) ), Size( 0, 60 ) );
|
||
aBigBoldFont.SetWeight( WEIGHT_BOLD );
|
||
|
||
String aHeader = String( ByteString( pHead ), RTL_TEXTENCODING_ISO_8859_1 );
|
||
String aFooter = String( ByteString( pFoot ), RTL_TEXTENCODING_ISO_8859_1 );
|
||
|
||
// calculate size of box
|
||
int nWidth = 0, nHeight = 0, w, i;
|
||
pPrinter->SetFont( aBigBoldFont );
|
||
int nBigHeight = pPrinter->GetTextHeight();
|
||
nWidth = pPrinter->GetTextWidth( aHeader );
|
||
w = pPrinter->GetTextWidth( aFooter );
|
||
nWidth = w > nWidth ? w : nWidth;
|
||
|
||
nHeight = 3*nBigHeight;
|
||
|
||
pPrinter->SetFont( aNormalFont );
|
||
int nNormHeigth = pPrinter->GetTextHeight();
|
||
::std::list<String>::const_iterator it;
|
||
for( it = aLines.begin(); it != aLines.end(); ++it )
|
||
{
|
||
w = pPrinter->GetTextWidth( *it );
|
||
nWidth = w > nWidth ? w : nWidth;
|
||
}
|
||
nWidth += 100;
|
||
nHeight += nNormHeigth * (aLines.size() + 1);
|
||
|
||
Point aTopLeft( aPaperSize.Width() - nWidth - 50,
|
||
aPaperSize.Height() - nHeight - 50 );
|
||
pPrinter->DrawRect( Rectangle( aTopLeft, Size( nWidth, nHeight ) ) );
|
||
pPrinter->DrawLine( Point( aTopLeft.X(), aTopLeft.Y() + (3*nBigHeight/2) ),
|
||
Point( aTopLeft.X()+nWidth-1, aTopLeft.Y() + (3*nBigHeight/2) ) );
|
||
pPrinter->DrawLine( Point( aTopLeft.X(), aTopLeft.Y() + nHeight - (3*nBigHeight/2) ),
|
||
Point( aTopLeft.X()+nWidth-1, aTopLeft.Y() + nHeight - (3*nBigHeight/2) ) );
|
||
|
||
int nY = aTopLeft.Y() + (nHeight-nNormHeigth*aLines.size())/2;
|
||
for( it = aLines.begin(); it != aLines.end(); ++it )
|
||
{
|
||
w = pPrinter->GetTextWidth( *it );
|
||
pPrinter->DrawText( Point( aTopLeft.X() + (nWidth-w)/2, nY ), *it );
|
||
nY += nNormHeigth;
|
||
}
|
||
pPrinter->SetFont( aBigBoldFont );
|
||
w = pPrinter->GetTextWidth( aHeader );
|
||
pPrinter->DrawText( Point( aTopLeft.X() + (nWidth-w)/2, aTopLeft.Y()+nBigHeight/4 ), aHeader );
|
||
w = pPrinter->GetTextWidth( aFooter );
|
||
pPrinter->DrawText( Point( aTopLeft.X() + (nWidth-w)/2, aTopLeft.Y()+nHeight-(5*nBigHeight/4) ), aFooter );
|
||
|
||
pPrinter->Pop();
|
||
}
|
||
}
|
||
#endif
|
||
|
||
int nImplSysDialog = 0;
|
||
|
||
#define PRINTERSEQ_GET( _def_Seq, _def_Obj ) \
|
||
{ \
|
||
SvMemoryStream* _def_pStm = new SvMemoryStream( (char*)_def_Seq.getConstArray(), _def_Seq.getLength(), STREAM_READ ); \
|
||
_def_pStm->SetCompressMode( COMPRESSMODE_FULL ); \
|
||
*_def_pStm >> _def_Obj; \
|
||
delete _def_pStm; \
|
||
}
|
||
|
||
#define PRINTERSEQ_SET( _def_Obj, _def_Seq, _def_Type ) \
|
||
{ \
|
||
SvMemoryStream* _def_pStm = new SvMemoryStream( 8192, 8192 ); \
|
||
_def_pStm->SetCompressMode( COMPRESSMODE_FULL ); \
|
||
*_def_pStm << _def_Obj; \
|
||
_def_Seq = _def_Type( (sal_Int8*) (_def_pStm)->GetData(), (_def_pStm)->Tell() ); \
|
||
delete _def_pStm; \
|
||
}
|
||
|
||
// =======================================================================
|
||
|
||
#define PAPER_SLOPPY 20
|
||
#define PAPER_COUNT 9
|
||
|
||
static long ImplPaperFormats[PAPER_COUNT*2] =
|
||
{
|
||
29700, 42000, // A3
|
||
21000, 29700, // A4
|
||
14800, 21000, // A5
|
||
25000, 35300, // B4
|
||
17600, 25000, // B5
|
||
21600, 27900, // Letter
|
||
21600, 35600, // Legal
|
||
27900, 43100, // Tabloid
|
||
0, 0 // USER
|
||
};
|
||
|
||
// =======================================================================
|
||
|
||
Paper ImplGetPaperFormat( long nWidth100thMM, long nHeight100thMM )
|
||
{
|
||
USHORT i;
|
||
|
||
for( i = 0; i < PAPER_COUNT; i++ )
|
||
{
|
||
if ( (ImplPaperFormats[i*2] == nWidth100thMM) &&
|
||
(ImplPaperFormats[i*2+1] == nHeight100thMM) )
|
||
return (Paper)i;
|
||
}
|
||
|
||
for( i = 0; i < PAPER_COUNT; i++ )
|
||
{
|
||
if ( (Abs( ImplPaperFormats[i*2]-nWidth100thMM ) < PAPER_SLOPPY) &&
|
||
(Abs( ImplPaperFormats[i*2+1]-nHeight100thMM ) < PAPER_SLOPPY) )
|
||
return (Paper)i;
|
||
}
|
||
|
||
return PAPER_USER;
|
||
}
|
||
|
||
// =======================================================================
|
||
|
||
void ImplUpdateJobSetupPaper( JobSetup& rJobSetup )
|
||
{
|
||
const ImplJobSetup* pConstData = rJobSetup.ImplGetConstData();
|
||
|
||
if ( !pConstData->mnPaperWidth || !pConstData->mnPaperHeight )
|
||
{
|
||
if ( pConstData->mePaperFormat != PAPER_USER )
|
||
{
|
||
ImplJobSetup* pData = rJobSetup.ImplGetData();
|
||
pData->mnPaperWidth = ImplPaperFormats[((USHORT)pConstData->mePaperFormat)*2];
|
||
pData->mnPaperHeight = ImplPaperFormats[((USHORT)pConstData->mePaperFormat)*2+1];
|
||
}
|
||
}
|
||
else if ( pConstData->mePaperFormat == PAPER_USER )
|
||
{
|
||
Paper ePaper = ImplGetPaperFormat( pConstData->mnPaperWidth, pConstData->mnPaperHeight );
|
||
if ( ePaper != PAPER_USER )
|
||
rJobSetup.ImplGetData()->mePaperFormat = ePaper;
|
||
}
|
||
}
|
||
|
||
// ------------------
|
||
// - PrinterOptions -
|
||
// ------------------
|
||
|
||
PrinterOptions::PrinterOptions() :
|
||
mbReduceTransparency( FALSE ),
|
||
meReducedTransparencyMode( PRINTER_TRANSPARENCY_AUTO ),
|
||
mbReduceGradients( FALSE ),
|
||
meReducedGradientsMode( PRINTER_GRADIENT_STRIPES ),
|
||
mnReducedGradientStepCount( 64 ),
|
||
mbReduceBitmaps( FALSE ),
|
||
meReducedBitmapMode( PRINTER_BITMAP_NORMAL ),
|
||
mnReducedBitmapResolution( 200 ),
|
||
mbReducedBitmapsIncludeTransparency( TRUE ),
|
||
mbConvertToGreyscales( FALSE )
|
||
{
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
PrinterOptions::~PrinterOptions()
|
||
{
|
||
}
|
||
|
||
// -------------
|
||
// - QueueInfo -
|
||
// -------------
|
||
|
||
QueueInfo::QueueInfo()
|
||
{
|
||
mnStatus = 0;
|
||
mnJobs = 0;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
QueueInfo::QueueInfo( const QueueInfo& rInfo ) :
|
||
maPrinterName( rInfo.maPrinterName ),
|
||
maDriver( rInfo.maDriver ),
|
||
maLocation( rInfo.maLocation ),
|
||
maComment( rInfo.maComment ),
|
||
mnStatus( rInfo.mnStatus ),
|
||
mnJobs( rInfo.mnJobs )
|
||
{
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
QueueInfo::~QueueInfo()
|
||
{
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
const QueueInfo& QueueInfo::operator==( const QueueInfo& rInfo )
|
||
{
|
||
maPrinterName = rInfo.maPrinterName;
|
||
maDriver = rInfo.maDriver;
|
||
maLocation = rInfo.maLocation;
|
||
maComment = rInfo.maComment;
|
||
mnStatus = rInfo.mnStatus;
|
||
mnJobs = rInfo.mnJobs;
|
||
return *this;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
SvStream& operator<<( SvStream& rOStream, const QueueInfo& rInfo )
|
||
{
|
||
VersionCompat aCompat( rOStream, STREAM_WRITE, 1 );
|
||
|
||
rOStream.WriteByteString( rInfo.maPrinterName, RTL_TEXTENCODING_UTF8 );
|
||
rOStream.WriteByteString( rInfo.maDriver, RTL_TEXTENCODING_UTF8 );
|
||
rOStream.WriteByteString( rInfo.maLocation, RTL_TEXTENCODING_UTF8 );
|
||
rOStream.WriteByteString( rInfo.maComment, RTL_TEXTENCODING_UTF8 );
|
||
rOStream << rInfo.mnStatus;
|
||
rOStream << rInfo.mnJobs;
|
||
|
||
return rOStream;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
SvStream& operator>>( SvStream& rIStream, QueueInfo& rInfo )
|
||
{
|
||
VersionCompat aCompat( rIStream, STREAM_READ );
|
||
|
||
rIStream.ReadByteString( rInfo.maPrinterName, RTL_TEXTENCODING_UTF8 );
|
||
rIStream.ReadByteString( rInfo.maDriver, RTL_TEXTENCODING_UTF8 );
|
||
rIStream.ReadByteString( rInfo.maLocation, RTL_TEXTENCODING_UTF8 );
|
||
rIStream.ReadByteString( rInfo.maComment, RTL_TEXTENCODING_UTF8 );
|
||
rIStream >> rInfo.mnStatus;
|
||
rIStream >> rInfo.mnJobs;
|
||
|
||
return rIStream;
|
||
}
|
||
|
||
// =======================================================================
|
||
|
||
SalPrinterQueueInfo::SalPrinterQueueInfo()
|
||
{
|
||
mnStatus = 0;
|
||
mnJobs = QUEUE_JOBS_DONTKNOW;
|
||
mpSysData = NULL;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
SalPrinterQueueInfo::~SalPrinterQueueInfo()
|
||
{
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void ImplPrnQueueList::Add( SalPrinterQueueInfo* pData )
|
||
{
|
||
ImplPrnQueueData* pInfo = new ImplPrnQueueData;
|
||
pInfo->mpQueueInfo = NULL;
|
||
pInfo->mpSalQueueInfo = pData;
|
||
List::Insert( (void*)pInfo, LIST_APPEND );
|
||
}
|
||
|
||
// =======================================================================
|
||
|
||
static void ImplInitPrnQueueList()
|
||
{
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
|
||
pSVData->maGDIData.mpPrinterQueueList = new ImplPrnQueueList;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
pSVData->mpDefInst->GetPrinterQueueInfo( pSVData->maGDIData.mpPrinterQueueList );
|
||
#else
|
||
if ( pSVData->mpRemotePrinterList && pSVData->mpRemotePrinterList->GetPrinterCount() )
|
||
{
|
||
BOOL bPrinterInfoOk = FALSE;
|
||
const ULONG nCount = pSVData->mpRemotePrinterList->GetPrinterCount();
|
||
|
||
for( ULONG i = 0; i < nCount; i++ )
|
||
{
|
||
QueueInfo aQInfo;
|
||
SalPrinterQueueInfo* pNewInfo = new SalPrinterQueueInfo;
|
||
|
||
RemotePrinterInfo* pPrinterInfo = pSVData->mpRemotePrinterList->GetPrinter( i );
|
||
if ( pPrinterInfo->aServerName.CompareToAscii( RVP_CLIENT_SERVER_NAME ) != COMPARE_EQUAL )
|
||
{
|
||
REF( NMSP_CLIENT::XRmPrinterEnvironment ) xPrinterEnv( pSVData->mpRemotePrinterList->GetPrinterEnv( pPrinterInfo->aServerName ) );
|
||
if ( xPrinterEnv.is() )
|
||
{
|
||
CHECK_FOR_RVPSYNC_NORMAL();
|
||
try
|
||
{
|
||
if ( xPrinterEnv->GetPrinterInfo( pPrinterInfo->aPrinterName.GetBuffer(), pPrinterInfo->aRmQueueInfo ) )
|
||
bPrinterInfoOk = TRUE;
|
||
}
|
||
catch( RuntimeException &e )
|
||
{
|
||
rvpExceptionHandler();
|
||
bPrinterInfoOk = FALSE;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// short cut for client printers, info was sent before by the rvp Start command
|
||
bPrinterInfoOk = TRUE;
|
||
}
|
||
|
||
if ( bPrinterInfoOk )
|
||
{
|
||
PRINTERSEQ_GET( pPrinterInfo->aRmQueueInfo, aQInfo );
|
||
pNewInfo->maPrinterName = pPrinterInfo->GetFullName();
|
||
pNewInfo->maDriver = aQInfo.GetDriver();
|
||
pNewInfo->maLocation = aQInfo.GetLocation();
|
||
pNewInfo->maComment = aQInfo.GetComment();
|
||
pNewInfo->mnStatus = aQInfo.GetStatus();
|
||
pNewInfo->mnJobs = aQInfo.GetJobs();
|
||
pNewInfo->mpSysData = NULL;
|
||
pSVData->maGDIData.mpPrinterQueueList->Add( pNewInfo );
|
||
}
|
||
}
|
||
}
|
||
if ( !pSVData->maGDIData.mpPrinterQueueList->Count() )
|
||
{
|
||
SalPrinterQueueInfo* pNewInfo = new SalPrinterQueueInfo;
|
||
pNewInfo->maPrinterName = String::CreateFromAscii("No Printer");
|
||
pNewInfo->mpSysData = NULL;
|
||
pSVData->maGDIData.mpPrinterQueueList->Add( pNewInfo );
|
||
}
|
||
#endif
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void ImplDeletePrnQueueList()
|
||
{
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList;
|
||
|
||
if ( pPrnList )
|
||
{
|
||
ImplPrnQueueData* pInfo = pPrnList->First();
|
||
while ( pInfo )
|
||
{
|
||
if ( pInfo->mpQueueInfo )
|
||
delete pInfo->mpQueueInfo;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
pSVData->mpDefInst->DeletePrinterQueueInfo( pInfo->mpSalQueueInfo );
|
||
#else
|
||
delete pInfo->mpSalQueueInfo;
|
||
#endif
|
||
|
||
delete pInfo;
|
||
pInfo = pPrnList->Next();
|
||
}
|
||
|
||
delete pPrnList;
|
||
pSVData->maGDIData.mpPrinterQueueList = NULL;
|
||
}
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
USHORT Printer::GetQueueCount()
|
||
{
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
|
||
if ( !pSVData->maGDIData.mpPrinterQueueList )
|
||
ImplInitPrnQueueList();
|
||
|
||
return (USHORT)(pSVData->maGDIData.mpPrinterQueueList->Count());
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
const QueueInfo& Printer::GetQueueInfo( USHORT nQueue )
|
||
{
|
||
return GetQueueInfo( nQueue, TRUE );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
const QueueInfo& Printer::GetQueueInfo( USHORT nQueue, BOOL bStatus )
|
||
{
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
|
||
if ( !pSVData->maGDIData.mpPrinterQueueList )
|
||
ImplInitPrnQueueList();
|
||
|
||
DBG_ASSERT( nQueue < pSVData->maGDIData.mpPrinterQueueList->Count(),
|
||
"Printer::GetQueueInfo() - nQueue > QueueCount" );
|
||
|
||
ImplPrnQueueData* pInfo = pSVData->maGDIData.mpPrinterQueueList->Get( nQueue );
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
if ( bStatus )
|
||
pSVData->mpDefInst->GetPrinterQueueState( pInfo->mpSalQueueInfo );
|
||
#else
|
||
// ???
|
||
#endif
|
||
|
||
if ( !pInfo->mpQueueInfo )
|
||
pInfo->mpQueueInfo = new QueueInfo;
|
||
|
||
pInfo->mpQueueInfo->maPrinterName = pInfo->mpSalQueueInfo->maPrinterName;
|
||
pInfo->mpQueueInfo->maDriver = pInfo->mpSalQueueInfo->maDriver;
|
||
pInfo->mpQueueInfo->maLocation = pInfo->mpSalQueueInfo->maLocation;
|
||
pInfo->mpQueueInfo->maComment = pInfo->mpSalQueueInfo->maComment;
|
||
pInfo->mpQueueInfo->mnStatus = pInfo->mpSalQueueInfo->mnStatus;
|
||
pInfo->mpQueueInfo->mnJobs = pInfo->mpSalQueueInfo->mnJobs;
|
||
return *pInfo->mpQueueInfo;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
XubString Printer::GetDefaultPrinterName()
|
||
{
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
return pSVData->mpDefInst->GetDefaultPrinter();
|
||
#else
|
||
XubString aDefPrinterName;
|
||
if ( pSVData->mpRemotePrinterList )
|
||
{
|
||
RemotePrinterInfo* pDefPrinter = pSVData->mpRemotePrinterList->GetDefaultPrinter();
|
||
if ( pDefPrinter )
|
||
aDefPrinterName = pDefPrinter->GetFullName();
|
||
|
||
}
|
||
return aDefPrinterName;
|
||
#endif
|
||
}
|
||
|
||
// =======================================================================
|
||
|
||
void Printer::ImplInitData()
|
||
{
|
||
mbDevOutput = FALSE;
|
||
meOutDevType = OUTDEV_PRINTER;
|
||
mbDefPrinter = FALSE;
|
||
mnError = 0;
|
||
mnCurPage = 0;
|
||
mnCurPrintPage = 0;
|
||
mnPageQueueSize = 0;
|
||
mnCopyCount = 1;
|
||
mbCollateCopy = FALSE;
|
||
mbPrinting = FALSE;
|
||
mbJobActive = FALSE;
|
||
mbPrintFile = FALSE;
|
||
mbInPrintPage = FALSE;
|
||
mbNewJobSetup = FALSE;
|
||
mpInfoPrinter = NULL;
|
||
mpPrinter = NULL;
|
||
mpDisplayDev = NULL;
|
||
mpQPrinter = NULL;
|
||
mpQMtf = NULL;
|
||
mbIsQueuePrinter = FALSE;
|
||
mpPrinterOptions = new PrinterOptions;
|
||
|
||
// Printer in die Liste eintragen
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
mpNext = pSVData->maGDIData.mpFirstPrinter;
|
||
mpPrev = NULL;
|
||
if ( mpNext )
|
||
mpNext->mpPrev = this;
|
||
else
|
||
pSVData->maGDIData.mpLastPrinter = this;
|
||
pSVData->maGDIData.mpFirstPrinter = this;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::ImplInit( SalPrinterQueueInfo* pInfo )
|
||
{
|
||
// Testen, ob Treiber ueberhaupt mit dem JobSetup uebereinstimmt
|
||
ImplJobSetup* pJobSetup = maJobSetup.ImplGetData();
|
||
|
||
if ( pJobSetup->mpDriverData )
|
||
{
|
||
if ( (pJobSetup->maPrinterName != pInfo->maPrinterName) ||
|
||
(pJobSetup->maDriver != pInfo->maDriver) )
|
||
{
|
||
delete pJobSetup->mpDriverData;
|
||
pJobSetup->mpDriverData = NULL;
|
||
pJobSetup->mnDriverDataLen = 0;
|
||
}
|
||
}
|
||
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
|
||
// Printernamen merken
|
||
maPrinterName = pInfo->maPrinterName;
|
||
maDriver = pInfo->maDriver;
|
||
|
||
// In JobSetup den Printernamen eintragen
|
||
pJobSetup->maPrinterName = maPrinterName;
|
||
pJobSetup->maDriver = maDriver;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
mpInfoPrinter = pSVData->mpDefInst->CreateInfoPrinter( pInfo, pJobSetup );
|
||
mpPrinter = NULL;
|
||
mpJobPrinter = NULL;
|
||
mpJobGraphics = NULL;
|
||
ImplUpdateJobSetupPaper( maJobSetup );
|
||
|
||
if ( !mpInfoPrinter )
|
||
{
|
||
ImplInitDisplay( NULL );
|
||
return;
|
||
}
|
||
|
||
// we need a graphics
|
||
if ( !ImplGetGraphics() )
|
||
{
|
||
ImplInitDisplay( NULL );
|
||
return;
|
||
}
|
||
#else
|
||
|
||
String aPrinterName( maPrinterName.GetToken( 0, '@' ) );
|
||
String aPrintServerName( maPrinterName.GetToken( 1, '@' ) );
|
||
|
||
|
||
mpInfoPrinter = new RmPrinter;
|
||
|
||
Reference< ::com::sun::star::lang::XMultiServiceFactory > xPrinterFactory;
|
||
Reference< NMSP_CLIENT::XRmPrinter > xPrinter;
|
||
|
||
if (pSVData->mpRemotePrinterList)
|
||
{
|
||
// if ( !aPrintServerName.Len() )
|
||
// aPrintServerName = pSVData->mpRemotePrinterList->FindLocalPrintServer( aPrinterName );
|
||
|
||
xPrinterFactory = pSVData->mpRemotePrinterList->GetServerFactory( aPrintServerName );
|
||
if( xPrinterFactory.is() )
|
||
{
|
||
xPrinter = Reference< NMSP_CLIENT::XRmPrinter >( xPrinterFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OfficePrinter.stardiv.de" ) ) ), NMSP_UNO::UNO_QUERY );
|
||
mpInfoPrinter->SetInterface( xPrinter );
|
||
}
|
||
}
|
||
|
||
if ( ! xPrinter.is() )
|
||
{
|
||
delete mpInfoPrinter;
|
||
mpInfoPrinter = NULL;
|
||
ImplInitDisplay( NULL );
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
QueueInfo aQInfo;
|
||
NMSP_CLIENT::RmQueueInfo aRmQInfo;
|
||
NMSP_CLIENT::RmJobSetup aRmJobSetup;
|
||
const REF( NMSP_CLIENT::XRmPrinter )& rxPrinter = mpInfoPrinter->GetInterface();
|
||
|
||
aQInfo.maPrinterName = aPrinterName;
|
||
aQInfo.maDriver = pInfo->maDriver;
|
||
aQInfo.maLocation = pInfo->maLocation;
|
||
aQInfo.maComment = pInfo->maComment;
|
||
aQInfo.mnStatus = pInfo->mnStatus;
|
||
aQInfo.mnJobs = pInfo->mnJobs;
|
||
|
||
PRINTERSEQ_SET( aQInfo, aRmQInfo, NMSP_CLIENT::RmQueueInfo );
|
||
mpInfoPrinter->Create( aRmQInfo, aRmJobSetup );
|
||
PRINTERSEQ_GET( aRmJobSetup, maJobSetup );
|
||
|
||
if( rxPrinter.is() )
|
||
{
|
||
mpGraphics = new ImplServerGraphics( pSVData->mpRemotePrinterList->GetServerAtoms( aPrintServerName ) );
|
||
REF( NMSP_CLIENT::XRmOutputDevice ) aTmp( rxPrinter, NMSP_UNO::UNO_QUERY );
|
||
mpGraphics->SetInterface( aTmp );
|
||
}
|
||
|
||
if( !mpGraphics->GetInterface().is() )
|
||
{
|
||
delete mpGraphics, mpGraphics = NULL;
|
||
delete mpInfoPrinter, mpInfoPrinter = NULL;
|
||
ImplInitDisplay( NULL );
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
ImplGetServerGraphics();
|
||
}
|
||
}
|
||
#endif
|
||
|
||
// Daten initialisieren
|
||
ImplUpdatePageData();
|
||
mpFontList = new ImplDevFontList;
|
||
mpFontCache = new ImplFontCache( TRUE );
|
||
mpGraphics->GetDevFontList( mpFontList );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::ImplInitDisplay( const Window* pWindow )
|
||
{
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
|
||
mpInfoPrinter = NULL;
|
||
mpPrinter = NULL;
|
||
mpJobPrinter = NULL;
|
||
mpJobGraphics = NULL;
|
||
|
||
if ( pWindow )
|
||
mpDisplayDev = new VirtualDevice( *pWindow );
|
||
else
|
||
mpDisplayDev = new VirtualDevice();
|
||
mpFontList = pSVData->maGDIData.mpScreenFontList;
|
||
mpFontCache = pSVData->maGDIData.mpScreenFontCache;
|
||
mnDPIX = mpDisplayDev->mnDPIX;
|
||
mnDPIY = mpDisplayDev->mnDPIY;
|
||
|
||
#ifdef REMOTE_APPSERVER
|
||
mpGraphics = mpDisplayDev->mpGraphics;
|
||
#endif
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
SalPrinterQueueInfo* Printer::ImplGetQueueInfo( const XubString& rPrinterName,
|
||
const XubString* pDriver )
|
||
{
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
if ( !pSVData->maGDIData.mpPrinterQueueList )
|
||
ImplInitPrnQueueList();
|
||
|
||
ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList;
|
||
if ( pPrnList && pPrnList->Count() )
|
||
{
|
||
// Zuerst suchen wir nach dem Printer-Namen
|
||
ImplPrnQueueData* pBestInfo = NULL;
|
||
ImplPrnQueueData* pInfo = pPrnList->First();
|
||
while ( pInfo )
|
||
{
|
||
if ( pInfo->mpSalQueueInfo->maPrinterName == rPrinterName )
|
||
{
|
||
pBestInfo = pInfo;
|
||
if ( !pDriver || (pInfo->mpSalQueueInfo->maDriver == *pDriver) )
|
||
return pInfo->mpSalQueueInfo;
|
||
}
|
||
pInfo = pPrnList->Next();
|
||
}
|
||
|
||
// Wenn wir einen PrinterNamen gefunden haben und nur der Treiber
|
||
// nicht passt, nehmen wir diesen
|
||
if ( pBestInfo )
|
||
return pBestInfo->mpSalQueueInfo;
|
||
|
||
// Dann suchen wir caseinsensitiv
|
||
pInfo = pPrnList->First();
|
||
while ( pInfo )
|
||
{
|
||
if ( pInfo->mpSalQueueInfo->maPrinterName.EqualsIgnoreCaseAscii( rPrinterName ) )
|
||
{
|
||
pBestInfo = pInfo;
|
||
if ( !pDriver || pInfo->mpSalQueueInfo->maDriver.EqualsIgnoreCaseAscii( *pDriver ) )
|
||
return pInfo->mpSalQueueInfo;
|
||
}
|
||
pInfo = pPrnList->Next();
|
||
}
|
||
|
||
// Wenn wir einen PrinterNamen gefunden haben und nur der Treiber
|
||
// nicht passt, nehmen wir diesen
|
||
if ( pBestInfo )
|
||
return pBestInfo->mpSalQueueInfo;
|
||
|
||
// Und wenn wir immer noch keinen gefunden haben, suchen wir
|
||
// noch nach einem passenden Treiber
|
||
if ( pDriver )
|
||
{
|
||
pInfo = pPrnList->First();
|
||
while ( pInfo )
|
||
{
|
||
if ( pInfo->mpSalQueueInfo->maDriver == *pDriver )
|
||
return pInfo->mpSalQueueInfo;
|
||
pInfo = pPrnList->Next();
|
||
}
|
||
}
|
||
|
||
// Und wenn wir immer noch keinen gefunden, dann wir der
|
||
// Default-Drucker genommen
|
||
XubString aPrinterName = GetDefaultPrinterName();
|
||
pInfo = pPrnList->First();
|
||
while ( pInfo )
|
||
{
|
||
if ( pInfo->mpSalQueueInfo->maPrinterName == aPrinterName )
|
||
return pInfo->mpSalQueueInfo;
|
||
pInfo = pPrnList->Next();
|
||
}
|
||
|
||
// Und wenn wir diesen auch nicht finden, nehmen wir den ersten
|
||
// in der Liste, denn einige Installationen zerstoeren den
|
||
// Namen und andere Programme weichen dann normalerweise noch
|
||
// auf irgendeinen Drucker aus
|
||
pInfo = pPrnList->First();
|
||
if ( pInfo )
|
||
return pInfo->mpSalQueueInfo;
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::ImplUpdatePageData()
|
||
{
|
||
#ifndef REMOTE_APPSERVER
|
||
// we need a graphics
|
||
if ( !ImplGetGraphics() )
|
||
return;
|
||
|
||
mpGraphics->GetResolution( mnDPIX, mnDPIY );
|
||
mpInfoPrinter->GetPageInfo( maJobSetup.ImplGetConstData(),
|
||
mnOutWidth, mnOutHeight,
|
||
maPageOffset.X(), maPageOffset.Y(),
|
||
maPaperSize.Width(), maPaperSize.Height() );
|
||
#else
|
||
if ( mpInfoPrinter && mpGraphics )
|
||
{
|
||
mpGraphics->GetResolution( mnDPIX, mnDPIY );
|
||
mpInfoPrinter->GetPageInfo( mnOutWidth, mnOutHeight,
|
||
maPageOffset.X(), maPageOffset.Y(),
|
||
maPaperSize.Width(), maPaperSize.Height() );
|
||
}
|
||
#endif
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::ImplUpdateFontList()
|
||
{
|
||
ImplUpdateFontData( TRUE );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
Printer::Printer()
|
||
{
|
||
ImplInitData();
|
||
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( GetDefaultPrinterName(), NULL );
|
||
if ( pInfo )
|
||
{
|
||
ImplInit( pInfo );
|
||
if ( !IsDisplayPrinter() )
|
||
mbDefPrinter = TRUE;
|
||
}
|
||
else
|
||
ImplInitDisplay( NULL );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
Printer::Printer( const Window* pWindow )
|
||
{
|
||
ImplInitData();
|
||
ImplInitDisplay( pWindow );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
Printer::Printer( const JobSetup& rJobSetup ) :
|
||
maJobSetup( rJobSetup )
|
||
{
|
||
ImplInitData();
|
||
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rJobSetup.mpData->maPrinterName,
|
||
&rJobSetup.mpData->maDriver );
|
||
if ( pInfo )
|
||
{
|
||
ImplInit( pInfo );
|
||
SetJobSetup( rJobSetup );
|
||
}
|
||
else
|
||
{
|
||
ImplInitDisplay( NULL );
|
||
maJobSetup = JobSetup();
|
||
}
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
Printer::Printer( const QueueInfo& rQueueInfo )
|
||
{
|
||
ImplInitData();
|
||
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rQueueInfo.GetPrinterName(),
|
||
&rQueueInfo.GetDriver() );
|
||
if ( pInfo )
|
||
ImplInit( pInfo );
|
||
else
|
||
ImplInitDisplay( NULL );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
Printer::Printer( const XubString& rPrinterName )
|
||
{
|
||
ImplInitData();
|
||
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( rPrinterName, NULL );
|
||
if ( pInfo )
|
||
ImplInit( pInfo );
|
||
else
|
||
ImplInitDisplay( NULL );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
Printer::~Printer()
|
||
{
|
||
DBG_ASSERT( !IsPrinting(), "Printer::~Printer() - Job is printing" );
|
||
DBG_ASSERT( !IsJobActive(), "Printer::~Printer() - Job is active" );
|
||
DBG_ASSERT( !mpQPrinter, "Printer::~Printer() - QueuePrinter not destroyed" );
|
||
DBG_ASSERT( !mpQMtf, "Printer::~Printer() - QueueMetafile not destroyed" );
|
||
|
||
delete mpPrinterOptions;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
ImplReleaseGraphics();
|
||
if ( mpInfoPrinter )
|
||
ImplGetSVData()->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
|
||
#else
|
||
if ( mpInfoPrinter )
|
||
{
|
||
if( mpGraphics ) {
|
||
REF( NMSP_CLIENT::XRmOutputDevice ) aTmp;
|
||
mpGraphics->SetInterface( aTmp );
|
||
}
|
||
|
||
ImplReleaseServerGraphics();
|
||
|
||
if ( mpGetDevFontList )
|
||
{
|
||
delete mpGetDevFontList;
|
||
mpGetDevFontList = NULL;
|
||
}
|
||
if ( mpGetDevSizeList )
|
||
{
|
||
delete mpGetDevSizeList;
|
||
mpGetDevSizeList = NULL;
|
||
}
|
||
delete mpGraphics, mpGraphics = NULL;
|
||
delete mpInfoPrinter, mpInfoPrinter = NULL;
|
||
}
|
||
#endif
|
||
if ( mpDisplayDev )
|
||
delete mpDisplayDev;
|
||
else
|
||
{
|
||
// OutputDevice-Dtor versucht das gleiche, deshalb muss hier
|
||
// der FontEntry auch auf NULL gesetzt werden
|
||
if ( mpFontEntry )
|
||
{
|
||
mpFontCache->Release( mpFontEntry );
|
||
mpFontEntry = NULL;
|
||
}
|
||
if ( mpGetDevFontList )
|
||
{
|
||
delete mpGetDevFontList;
|
||
mpGetDevFontList = NULL;
|
||
}
|
||
if ( mpGetDevSizeList )
|
||
{
|
||
delete mpGetDevSizeList;
|
||
mpGetDevSizeList = NULL;
|
||
}
|
||
delete mpFontList;
|
||
delete mpFontCache;
|
||
}
|
||
|
||
// Printer aus der Liste eintragen
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
if ( mpPrev )
|
||
mpPrev->mpNext = mpNext;
|
||
else
|
||
pSVData->maGDIData.mpFirstPrinter = mpNext;
|
||
if ( mpNext )
|
||
mpNext->mpPrev = mpPrev;
|
||
else
|
||
pSVData->maGDIData.mpLastPrinter = mpPrev;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
ULONG Printer::GetCapabilities( USHORT nType ) const
|
||
{
|
||
if ( IsDisplayPrinter() )
|
||
return FALSE;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
return mpInfoPrinter->GetCapabilities( maJobSetup.ImplGetConstData(), nType );
|
||
#else
|
||
return mpInfoPrinter->GetCapabilities( nType );
|
||
#endif
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::HasSupport( PrinterSupport eFeature, BOOL bInJob ) const
|
||
{
|
||
switch ( eFeature )
|
||
{
|
||
case SUPPORT_SET_ORIENTATION:
|
||
return (BOOL)GetCapabilities( PRINTER_CAPABILITIES_SETORIENTATION );
|
||
case SUPPORT_SET_PAPERBIN:
|
||
return (BOOL)GetCapabilities( PRINTER_CAPABILITIES_SETPAPERBIN );
|
||
case SUPPORT_SET_PAPERSIZE:
|
||
return (BOOL)GetCapabilities( PRINTER_CAPABILITIES_SETPAPERSIZE );
|
||
case SUPPORT_SET_PAPER:
|
||
return (BOOL)GetCapabilities( PRINTER_CAPABILITIES_SETPAPER );
|
||
case SUPPORT_COPY:
|
||
return (GetCapabilities( PRINTER_CAPABILITIES_COPIES ) != 0);
|
||
case SUPPORT_COLLATECOPY:
|
||
return (GetCapabilities( PRINTER_CAPABILITIES_COLLATECOPIES ) != 0);
|
||
case SUPPORT_SETUPDIALOG:
|
||
return (BOOL)GetCapabilities( PRINTER_CAPABILITIES_SUPPORTDIALOG );
|
||
case SUPPORT_FAX:
|
||
return (BOOL) GetCapabilities( PRINTER_CAPABILITIES_FAX );
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::SetJobSetup( const JobSetup& rSetup )
|
||
{
|
||
if ( IsDisplayPrinter() || mbInPrintPage )
|
||
return FALSE;
|
||
|
||
JobSetup aJobSetup = rSetup;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
ImplReleaseGraphics();
|
||
if ( mpInfoPrinter->SetPrinterData( aJobSetup.ImplGetData() ) )
|
||
{
|
||
ImplUpdateJobSetupPaper( aJobSetup );
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
ImplUpdatePageData();
|
||
ImplUpdateFontList();
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
#else
|
||
if ( mpInfoPrinter )
|
||
{
|
||
NMSP_CLIENT::RmJobSetup aRmJobSetup;
|
||
|
||
PRINTERSEQ_SET( aJobSetup, aRmJobSetup, NMSP_CLIENT::RmJobSetup );
|
||
if ( mpInfoPrinter->SetJobSetup( aRmJobSetup ) )
|
||
{
|
||
PRINTERSEQ_GET( aRmJobSetup, aJobSetup );
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
ImplUpdatePageData();
|
||
ImplUpdateFontList();
|
||
return TRUE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
return FALSE;
|
||
#endif
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
#ifdef REMOTE_APPSERVER
|
||
IMPL_LINK( Printer, UserSetupCompleted, ::com::sun::star::uno::Any*, pResult )
|
||
{
|
||
::vos::OGuard guard( Application::GetSolarMutex( ) );
|
||
|
||
if( pResult->hasValue() )
|
||
{
|
||
mbUserSetupResult = TRUE;
|
||
|
||
::com::sun::star::portal::client::RmJobSetup aRmJobSetup;
|
||
*pResult >>= aRmJobSetup;
|
||
JobSetup aJobSetup;
|
||
PRNSEQ_GET( aRmJobSetup, aJobSetup );
|
||
|
||
ImplUpdateJobSetupPaper( aJobSetup );
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
ImplUpdatePageData();
|
||
ImplUpdateFontList();
|
||
}
|
||
else
|
||
mbUserSetupResult = FALSE;
|
||
|
||
mbUserSetupCompleted = TRUE;
|
||
return 0;
|
||
}
|
||
#endif
|
||
|
||
BOOL Printer::Setup( Window* pWindow )
|
||
{
|
||
if ( IsDisplayPrinter() )
|
||
return FALSE;
|
||
|
||
if ( IsJobActive() || IsPrinting() )
|
||
return FALSE;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
JobSetup aJobSetup = maJobSetup;
|
||
SalFrame* pFrame;
|
||
if ( !pWindow )
|
||
pFrame = ImplGetDefaultWindow()->ImplGetFrame();
|
||
else
|
||
pFrame = pWindow->ImplGetFrame();
|
||
ImplReleaseGraphics();
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
pSVData->maAppData.mnModalMode++;
|
||
nImplSysDialog++;
|
||
BOOL bSetup = mpInfoPrinter->Setup( pFrame, aJobSetup.ImplGetData() );
|
||
pSVData->maAppData.mnModalMode--;
|
||
nImplSysDialog--;
|
||
if ( bSetup )
|
||
{
|
||
ImplUpdateJobSetupPaper( aJobSetup );
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
ImplUpdatePageData();
|
||
ImplUpdateFontList();
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
#else
|
||
NMSP_CLIENT::RmJobSetup aRmJobSetup;
|
||
PRNSEQ_SET( aRmJobSetup, maJobSetup );
|
||
mpInfoPrinter->SetJobSetup( aRmJobSetup );
|
||
RmFrameWindow* pFrame;
|
||
if ( !pWindow )
|
||
pFrame = ImplGetDefaultWindow()->ImplGetFrame();
|
||
else
|
||
pFrame = pWindow->ImplGetFrame();
|
||
mbUserSetupCompleted = FALSE;
|
||
mpInfoPrinter->UserSetup( pFrame->GetFrameInterface(), pFrame->InsertUserEventLink( LINK( this, Printer, UserSetupCompleted ) ) );
|
||
while( ! mbUserSetupCompleted )
|
||
Application::Reschedule();
|
||
return mbUserSetupResult;
|
||
#endif
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::SetPrinterProps( const Printer* pPrinter )
|
||
{
|
||
if ( IsJobActive() || IsPrinting() )
|
||
return FALSE;
|
||
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
|
||
mbDefPrinter = pPrinter->mbDefPrinter;
|
||
maPrintFile = pPrinter->maPrintFile;
|
||
mbPrintFile = pPrinter->mbPrintFile;
|
||
mnCopyCount = pPrinter->mnCopyCount;
|
||
mbCollateCopy = pPrinter->mbCollateCopy;
|
||
mnPageQueueSize = pPrinter->mnPageQueueSize;
|
||
*mpPrinterOptions = *pPrinter->mpPrinterOptions;
|
||
|
||
if ( pPrinter->IsDisplayPrinter() )
|
||
{
|
||
// Alten Printer zerstoeren
|
||
if ( !IsDisplayPrinter() )
|
||
{
|
||
#ifndef REMOTE_APPSERVER
|
||
ImplReleaseGraphics();
|
||
pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
|
||
#else
|
||
if ( mpInfoPrinter )
|
||
{
|
||
if( mpGraphics ) {
|
||
REF( NMSP_CLIENT::XRmOutputDevice ) aTmp;
|
||
mpGraphics->SetInterface( aTmp );
|
||
}
|
||
|
||
ImplReleaseServerGraphics();
|
||
delete mpGraphics, mpGraphics = NULL;
|
||
delete mpInfoPrinter, mpInfoPrinter = NULL;
|
||
}
|
||
#endif
|
||
if ( mpFontEntry )
|
||
{
|
||
mpFontCache->Release( mpFontEntry );
|
||
mpFontEntry = NULL;
|
||
}
|
||
if ( mpGetDevFontList )
|
||
{
|
||
delete mpGetDevFontList;
|
||
mpGetDevFontList = NULL;
|
||
}
|
||
if ( mpGetDevSizeList )
|
||
{
|
||
delete mpGetDevSizeList;
|
||
mpGetDevSizeList = NULL;
|
||
}
|
||
delete mpFontList;
|
||
delete mpFontCache;
|
||
mbInitFont = TRUE;
|
||
mbNewFont = TRUE;
|
||
mpInfoPrinter = NULL;
|
||
}
|
||
|
||
// Neuen Printer bauen
|
||
ImplInitDisplay( NULL );
|
||
return TRUE;
|
||
}
|
||
|
||
// Alten Printer zerstoeren?
|
||
if ( GetName() != pPrinter->GetName() )
|
||
{
|
||
#ifndef REMOTE_APPSERVER
|
||
ImplReleaseGraphics();
|
||
#endif
|
||
if ( mpDisplayDev )
|
||
{
|
||
delete mpDisplayDev;
|
||
mpDisplayDev = NULL;
|
||
}
|
||
else
|
||
{
|
||
#ifndef REMOTE_APPSERVER
|
||
pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
|
||
#else
|
||
if ( mpInfoPrinter )
|
||
{
|
||
if( mpGraphics ) {
|
||
REF( NMSP_CLIENT::XRmOutputDevice ) aTmp;
|
||
mpGraphics->SetInterface( aTmp );
|
||
}
|
||
|
||
ImplReleaseServerGraphics();
|
||
delete mpGraphics, mpGraphics = NULL;
|
||
delete mpInfoPrinter, mpInfoPrinter = NULL;
|
||
}
|
||
#endif
|
||
|
||
if ( mpFontEntry )
|
||
{
|
||
mpFontCache->Release( mpFontEntry );
|
||
mpFontEntry = NULL;
|
||
}
|
||
if ( mpGetDevFontList )
|
||
{
|
||
delete mpGetDevFontList;
|
||
mpGetDevFontList = NULL;
|
||
}
|
||
if ( mpGetDevSizeList )
|
||
{
|
||
delete mpGetDevSizeList;
|
||
mpGetDevSizeList = NULL;
|
||
}
|
||
delete mpFontList;
|
||
delete mpFontCache;
|
||
mbInitFont = TRUE;
|
||
mbNewFont = TRUE;
|
||
mpInfoPrinter = NULL;
|
||
}
|
||
|
||
// Neuen Printer bauen
|
||
XubString maDriver = pPrinter->GetDriverName();
|
||
SalPrinterQueueInfo* pInfo = ImplGetQueueInfo( pPrinter->GetName(), &maDriver );
|
||
if ( pInfo )
|
||
{
|
||
ImplInit( pInfo );
|
||
SetJobSetup( pPrinter->GetJobSetup() );
|
||
}
|
||
else
|
||
ImplInitDisplay( NULL );
|
||
}
|
||
else
|
||
SetJobSetup( pPrinter->GetJobSetup() );
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::SetOrientation( Orientation eOrientation )
|
||
{
|
||
if ( mbInPrintPage )
|
||
return FALSE;
|
||
|
||
if ( maJobSetup.ImplGetConstData()->meOrientation != eOrientation )
|
||
{
|
||
JobSetup aJobSetup = maJobSetup;
|
||
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
||
pSetupData->meOrientation = eOrientation;
|
||
|
||
if ( IsDisplayPrinter() )
|
||
{
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
return TRUE;
|
||
}
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
ImplReleaseGraphics();
|
||
if ( mpInfoPrinter->SetData( SAL_JOBSET_ORIENTATION, pSetupData ) )
|
||
{
|
||
ImplUpdateJobSetupPaper( aJobSetup );
|
||
#else
|
||
NMSP_CLIENT::RmJobSetup aRmJobSetup;
|
||
PRINTERSEQ_SET( aJobSetup, aRmJobSetup, NMSP_CLIENT::RmJobSetup );
|
||
if ( mpInfoPrinter->SetOrientation( (unsigned short)eOrientation, aRmJobSetup ) )
|
||
{
|
||
PRINTERSEQ_GET( aRmJobSetup, aJobSetup );
|
||
#endif
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
ImplUpdatePageData();
|
||
ImplUpdateFontList();
|
||
return TRUE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
Orientation Printer::GetOrientation() const
|
||
{
|
||
return maJobSetup.ImplGetConstData()->meOrientation;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::SetPaperBin( USHORT nPaperBin )
|
||
{
|
||
if ( mbInPrintPage )
|
||
return FALSE;
|
||
|
||
if ( (maJobSetup.ImplGetConstData()->mnPaperBin != nPaperBin) &&
|
||
(nPaperBin < GetPaperBinCount()) )
|
||
{
|
||
JobSetup aJobSetup = maJobSetup;
|
||
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
||
pSetupData->mnPaperBin = nPaperBin;
|
||
|
||
if ( IsDisplayPrinter() )
|
||
{
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
return TRUE;
|
||
}
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
ImplReleaseGraphics();
|
||
if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERBIN, pSetupData ) )
|
||
{
|
||
ImplUpdateJobSetupPaper( aJobSetup );
|
||
#else
|
||
NMSP_CLIENT::RmJobSetup aRmJobSetup;
|
||
PRINTERSEQ_SET( aJobSetup, aRmJobSetup, NMSP_CLIENT::RmJobSetup );
|
||
if ( mpInfoPrinter->SetPaperBin( nPaperBin, aRmJobSetup ) )
|
||
{
|
||
PRINTERSEQ_GET( aRmJobSetup, aJobSetup );
|
||
#endif
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
ImplUpdatePageData();
|
||
ImplUpdateFontList();
|
||
return TRUE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
USHORT Printer::GetPaperBin() const
|
||
{
|
||
return maJobSetup.ImplGetConstData()->mnPaperBin;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::SetPaper( Paper ePaper )
|
||
{
|
||
if ( mbInPrintPage )
|
||
return FALSE;
|
||
|
||
if ( maJobSetup.ImplGetConstData()->mePaperFormat != ePaper )
|
||
{
|
||
JobSetup aJobSetup = maJobSetup;
|
||
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
||
pSetupData->mePaperFormat = ePaper;
|
||
if ( ePaper != PAPER_USER )
|
||
{
|
||
pSetupData->mnPaperWidth = ImplPaperFormats[((USHORT)ePaper)*2];
|
||
pSetupData->mnPaperHeight = ImplPaperFormats[((USHORT)ePaper)*2+1];
|
||
}
|
||
|
||
if ( IsDisplayPrinter() )
|
||
{
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
return TRUE;
|
||
}
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
ImplReleaseGraphics();
|
||
if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE, pSetupData ) )
|
||
{
|
||
ImplUpdateJobSetupPaper( aJobSetup );
|
||
#else
|
||
NMSP_CLIENT::RmJobSetup aRmJobSetup;
|
||
PRINTERSEQ_SET( aJobSetup, aRmJobSetup, NMSP_CLIENT::RmJobSetup );
|
||
if ( mpInfoPrinter->SetPaper( (unsigned short)ePaper, aRmJobSetup ) )
|
||
{
|
||
PRINTERSEQ_GET( aRmJobSetup, aJobSetup );
|
||
#endif
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
ImplUpdatePageData();
|
||
ImplUpdateFontList();
|
||
return TRUE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::SetPaperSizeUser( const Size& rSize )
|
||
{
|
||
if ( mbInPrintPage )
|
||
return FALSE;
|
||
|
||
MapMode aMap100thMM( MAP_100TH_MM );
|
||
Size aPixSize = LogicToPixel( rSize );
|
||
Size aPageSize = PixelToLogic( aPixSize, aMap100thMM );
|
||
if ( (maJobSetup.ImplGetConstData()->mePaperFormat != PAPER_USER) ||
|
||
(maJobSetup.ImplGetConstData()->mnPaperWidth != aPageSize.Width()) ||
|
||
(maJobSetup.ImplGetConstData()->mnPaperHeight != aPageSize.Height()) )
|
||
{
|
||
JobSetup aJobSetup = maJobSetup;
|
||
ImplJobSetup* pSetupData = aJobSetup.ImplGetData();
|
||
pSetupData->mePaperFormat = PAPER_USER;
|
||
pSetupData->mnPaperWidth = aPageSize.Width();
|
||
pSetupData->mnPaperHeight = aPageSize.Height();
|
||
|
||
if ( IsDisplayPrinter() )
|
||
{
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
return TRUE;
|
||
}
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
ImplReleaseGraphics();
|
||
if ( mpInfoPrinter->SetData( SAL_JOBSET_PAPERSIZE, pSetupData ) )
|
||
{
|
||
ImplUpdateJobSetupPaper( aJobSetup );
|
||
#else
|
||
NMSP_CLIENT::RmJobSetup aRmJobSetup;
|
||
PRINTERSEQ_SET( aJobSetup, aRmJobSetup, NMSP_CLIENT::RmJobSetup );
|
||
if ( mpInfoPrinter->SetPaperSizeUser( aPixSize.Width(), aPixSize.Height(), aRmJobSetup ) )
|
||
{
|
||
PRINTERSEQ_GET( aRmJobSetup, aJobSetup );
|
||
#endif
|
||
mbNewJobSetup = TRUE;
|
||
maJobSetup = aJobSetup;
|
||
ImplUpdatePageData();
|
||
ImplUpdateFontList();
|
||
return TRUE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
Paper Printer::GetPaper() const
|
||
{
|
||
return maJobSetup.ImplGetConstData()->mePaperFormat;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
USHORT Printer::GetPaperBinCount() const
|
||
{
|
||
if ( IsDisplayPrinter() )
|
||
return 0;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
return (USHORT)mpInfoPrinter->GetPaperBinCount( maJobSetup.ImplGetConstData() );
|
||
#else
|
||
if ( mpInfoPrinter )
|
||
return mpInfoPrinter->GetPaperBinCount();
|
||
else
|
||
return 0;
|
||
#endif
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
XubString Printer::GetPaperBinName( USHORT nPaperBin ) const
|
||
{
|
||
if ( IsDisplayPrinter() )
|
||
return ImplGetSVEmptyStr();
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
if ( nPaperBin < GetPaperBinCount() )
|
||
return mpInfoPrinter->GetPaperBinName( maJobSetup.ImplGetConstData(), nPaperBin );
|
||
else
|
||
return ImplGetSVEmptyStr();
|
||
#else
|
||
if ( mpInfoPrinter )
|
||
return (String)mpInfoPrinter->GetPaperBinName( nPaperBin );
|
||
else
|
||
return ImplGetSVEmptyStr();
|
||
#endif
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::SetCopyCount( USHORT nCopy, BOOL bCollate )
|
||
{
|
||
mnCopyCount = nCopy;
|
||
return TRUE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::Error()
|
||
{
|
||
maErrorHdl.Call( this );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::StartPrint()
|
||
{
|
||
maStartPrintHdl.Call( this );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::EndPrint()
|
||
{
|
||
maEndPrintHdl.Call( this );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::PrintPage()
|
||
{
|
||
maPrintPageHdl.Call( this );
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
|
||
ULONG ImplSalPrinterErrorCodeToVCL( ULONG nError )
|
||
{
|
||
ULONG nVCLError;
|
||
switch ( nError )
|
||
{
|
||
case 0:
|
||
nVCLError = PRINTER_OK;
|
||
break;
|
||
case SAL_PRINTER_ERROR_ABORT:
|
||
nVCLError = PRINTER_ABORT;
|
||
break;
|
||
default:
|
||
nVCLError = PRINTER_GENERALERROR;
|
||
break;
|
||
}
|
||
|
||
return nVCLError;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
void Printer::ImplEndPrint()
|
||
{
|
||
mbPrinting = FALSE;
|
||
mnCurPrintPage = 0;
|
||
maJobName.Erase();
|
||
mpQPrinter->Destroy();
|
||
mpQPrinter = NULL;
|
||
EndPrint();
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
IMPL_LINK( Printer, ImplDestroyPrinterAsync, void*, pSalPrinter )
|
||
{
|
||
SalPrinter* pPrinter = (SalPrinter*)pSalPrinter;
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
pSVData->mpDefInst->DestroyPrinter( pPrinter );
|
||
return 0;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
#else
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
static void ImplDeletePrintSpooler( PrintSpooler* pPrintSpooler )
|
||
{
|
||
if( pPrintSpooler != 0 )
|
||
{
|
||
pPrintSpooler->mxPrintSpooler = REF( NMSP_CLIENT::XRmPrintSpooler )();
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::StartJob( const XubString& rJobName )
|
||
{
|
||
mnError = PRINTER_OK;
|
||
|
||
if ( IsDisplayPrinter() )
|
||
return FALSE;
|
||
|
||
if ( IsJobActive() || IsPrinting() )
|
||
return FALSE;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
ULONG nCopies = mnCopyCount;
|
||
BOOL bCollateCopy = mbCollateCopy;
|
||
BOOL bUserCopy = FALSE;
|
||
if ( IsQueuePrinter() )
|
||
{
|
||
if ( ((ImplQPrinter*)this)->IsUserCopy() )
|
||
{
|
||
nCopies = 1;
|
||
bCollateCopy = FALSE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if ( nCopies > 1 )
|
||
{
|
||
ULONG nDevCopy;
|
||
|
||
if ( bCollateCopy )
|
||
nDevCopy = GetCapabilities( PRINTER_CAPABILITIES_COLLATECOPIES );
|
||
else
|
||
nDevCopy = GetCapabilities( PRINTER_CAPABILITIES_COPIES );
|
||
|
||
// Muessen Kopien selber gemacht werden?
|
||
if ( nCopies > nDevCopy )
|
||
{
|
||
bUserCopy = TRUE;
|
||
nCopies = 1;
|
||
bCollateCopy = FALSE;
|
||
}
|
||
}
|
||
else
|
||
bCollateCopy = FALSE;
|
||
|
||
// we need queue printing
|
||
if( !mnPageQueueSize )
|
||
mnPageQueueSize = 1;
|
||
}
|
||
|
||
if ( !mnPageQueueSize )
|
||
{
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
mpPrinter = pSVData->mpDefInst->CreatePrinter( mpInfoPrinter );
|
||
|
||
if ( !mpPrinter )
|
||
return FALSE;
|
||
|
||
XubString* pPrintFile;
|
||
if ( mbPrintFile )
|
||
pPrintFile = &maPrintFile;
|
||
else
|
||
pPrintFile = NULL;
|
||
|
||
if ( !mpPrinter->StartJob( pPrintFile, rJobName, Application::GetDisplayName(),
|
||
nCopies, bCollateCopy,
|
||
maJobSetup.ImplGetConstData() ) )
|
||
{
|
||
mnError = ImplSalPrinterErrorCodeToVCL( mpPrinter->GetErrorCode() );
|
||
if ( !mnError )
|
||
mnError = PRINTER_GENERALERROR;
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
pSVData->mpDefInst->DestroyPrinter( mpPrinter );
|
||
mpPrinter = NULL;
|
||
return FALSE;
|
||
}
|
||
|
||
mbNewJobSetup = FALSE;
|
||
maJobName = rJobName;
|
||
mnCurPage = 1;
|
||
mnCurPrintPage = 1;
|
||
mbJobActive = TRUE;
|
||
mbPrinting = TRUE;
|
||
StartPrint();
|
||
}
|
||
else
|
||
{
|
||
mpQPrinter = new ImplQPrinter( this );
|
||
mpQPrinter->SetUserCopy( bUserCopy );
|
||
mpQPrinter->SetPrinterOptions( *mpPrinterOptions );
|
||
if ( mpQPrinter->StartJob( rJobName ) )
|
||
{
|
||
mbNewJobSetup = FALSE;
|
||
maJobName = rJobName;
|
||
mnCurPage = 1;
|
||
mbJobActive = TRUE;
|
||
mbPrinting = TRUE;
|
||
StartPrint();
|
||
mpQPrinter->StartQueuePrint();
|
||
}
|
||
else
|
||
{
|
||
mnError = mpQPrinter->GetErrorCode();
|
||
mpQPrinter->Destroy();
|
||
mpQPrinter = NULL;
|
||
return FALSE;
|
||
}
|
||
}
|
||
#else
|
||
BOOL bResult = FALSE;
|
||
ImplSVData* pSVData = ImplGetSVData();
|
||
|
||
String aServerName( maPrinterName.GetToken( 1, '@' ) );
|
||
|
||
// build a new connection if not client
|
||
Reference< ::com::sun::star::lang::XMultiServiceFactory > xServerFactory;
|
||
Reference< ::com::sun::star::connection::XConnection > xConnection;
|
||
Reference< ::com::sun::star::bridge::XBridgeFactory > xBridgeFactory;
|
||
|
||
pSVData->mpRemotePrinterList->CreateNewPrinterConnection( maPrinterName.GetToken( 1, '@' ), xServerFactory, xConnection, xBridgeFactory );
|
||
if( xServerFactory.is() )
|
||
{
|
||
REF( NMSP_CLIENT::XRmSpoolLauncher ) xLauncher( xServerFactory->createInstance( ::rtl::OUString::createFromAscii( "OfficeSpoolLauncher.stardiv.de" ) ), NMSP_UNO::UNO_QUERY );
|
||
if( xLauncher.is() )
|
||
{
|
||
CHECK_FOR_RVPSYNC_NORMAL();
|
||
try
|
||
{
|
||
if ( xLauncher->LaunchSpooler( pSVData->mpUserInfo->sName,
|
||
pSVData->mpUserInfo->sPassword ) )
|
||
{
|
||
if( xBridgeFactory.is() ) // else this a the client connection
|
||
{
|
||
// get objects from transferred sospool connection
|
||
xServerFactory = Reference< ::com::sun::star::lang::XMultiServiceFactory >();
|
||
Reference< ::com::sun::star::bridge::XBridge >
|
||
xBridge( xBridgeFactory->createBridge( ::rtl::OUString(), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "iiop" ) ), xConnection, Reference< ::com::sun::star::bridge::XInstanceProvider >() ) );
|
||
xServerFactory = Reference< ::com::sun::star::lang::XMultiServiceFactory >( xBridge->getInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "SpoolMultiServiceFactory.sprintd.daemons.stardiv.de" ) ) ), UNO_QUERY );
|
||
}
|
||
|
||
mpPrinter = new PrintSpooler();
|
||
mpPrinter->mxPrintSpooler = REF( NMSP_CLIENT::XRmPrintSpooler )( xServerFactory->createInstance( ::rtl::OUString::createFromAscii( "OfficePrintSpooler.stardiv.de" ) ), NMSP_UNO::UNO_QUERY );
|
||
if( mpPrinter->mxPrintSpooler.is() )
|
||
{
|
||
NMSP_CLIENT::RmJobSetup aRmJobSetup;
|
||
PRNSEQ_SET( aRmJobSetup, maJobSetup );
|
||
CHECK_FOR_RVPSYNC_NORMAL()
|
||
mpPrinter->mxPrintSpooler->Create( aRmJobSetup );
|
||
CHECK_FOR_RVPSYNC_NORMAL()
|
||
bResult = mpPrinter->mxPrintSpooler->StartJob( mnCopyCount, mbCollateCopy, rJobName, maPrintFile, mbPrintFile );
|
||
}
|
||
}
|
||
}
|
||
catch( RuntimeException &e )
|
||
{
|
||
rvpExceptionHandler();
|
||
bResult = FALSE;
|
||
mpPrinter = NULL;
|
||
}
|
||
}
|
||
|
||
if ( bResult )
|
||
{
|
||
mbNewJobSetup = FALSE;
|
||
maJobName = rJobName;
|
||
mnCurPage = 1;
|
||
mnCurPrintPage = 1;
|
||
mbJobActive = TRUE;
|
||
mbPrinting = TRUE;
|
||
}
|
||
else if ( mpPrinter && mpPrinter->mxPrintSpooler.is() )
|
||
{
|
||
ImplDeletePrintSpooler( mpPrinter );
|
||
mpPrinter = NULL;
|
||
}
|
||
}
|
||
|
||
if ( !bResult )
|
||
mnError = PRINTER_GENERALERROR;
|
||
|
||
return bResult;
|
||
#endif
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::EndJob()
|
||
{
|
||
if ( !IsJobActive() )
|
||
return FALSE;
|
||
|
||
DBG_ASSERT( !mbInPrintPage, "Printer::EndJob() - StartPage() without EndPage() called" );
|
||
|
||
mbJobActive = FALSE;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
if ( mpPrinter || mpQPrinter )
|
||
{
|
||
ImplReleaseGraphics();
|
||
|
||
mnCurPage = 0;
|
||
|
||
if ( mpPrinter )
|
||
{
|
||
mbPrinting = FALSE;
|
||
mnCurPrintPage = 0;
|
||
maJobName.Erase();
|
||
|
||
mbDevOutput = FALSE;
|
||
mpPrinter->EndJob();
|
||
// Hier den Drucker nicht asyncron zerstoeren, da es
|
||
// W95 nicht verkraftet, wenn gleichzeitig gedruckt wird
|
||
// und ein Druckerobjekt zerstoert wird
|
||
ImplGetSVData()->mpDefInst->DestroyPrinter( mpPrinter );
|
||
mpPrinter = NULL;
|
||
EndPrint();
|
||
}
|
||
else
|
||
mpQPrinter->EndQueuePrint();
|
||
|
||
return TRUE;
|
||
}
|
||
#else
|
||
if ( mpPrinter )
|
||
{
|
||
CHECK_FOR_RVPSYNC_NORMAL();
|
||
try
|
||
{
|
||
mpPrinter->mxPrintSpooler->EndJob( vcl::unohelper::GetMultiServiceFactory() );
|
||
}
|
||
catch( RuntimeException &e )
|
||
{
|
||
rvpExceptionHandler();
|
||
}
|
||
mbPrinting = FALSE;
|
||
mnCurPage = 0;
|
||
mnCurPrintPage = 0;
|
||
maJobName.Erase();
|
||
EndPrint();
|
||
|
||
ImplDeletePrintSpooler( mpPrinter );
|
||
mpPrinter = NULL;
|
||
|
||
return TRUE;
|
||
}
|
||
#endif
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::AbortJob()
|
||
{
|
||
// Wenn wir einen Queue-Printer haben, kann man diesen noch mit
|
||
// AbortJob() abbrechen, solange dieser noch am Drucken ist
|
||
if ( !IsJobActive() && !IsPrinting() )
|
||
return FALSE;
|
||
|
||
mbJobActive = FALSE;
|
||
mbInPrintPage = FALSE;
|
||
mpJobGraphics = NULL;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
if ( mpPrinter || mpQPrinter )
|
||
{
|
||
mbPrinting = FALSE;
|
||
mnCurPage = 0;
|
||
mnCurPrintPage = 0;
|
||
maJobName.Erase();
|
||
|
||
if ( mpPrinter )
|
||
{
|
||
ImplReleaseGraphics();
|
||
mbDevOutput = FALSE;
|
||
mpPrinter->AbortJob();
|
||
Application::PostUserEvent( LINK( this, Printer, ImplDestroyPrinterAsync ), mpPrinter );
|
||
mpPrinter = NULL;
|
||
EndPrint();
|
||
}
|
||
else
|
||
{
|
||
mpQPrinter->AbortQueuePrint();
|
||
mpQPrinter->Destroy();
|
||
mpQPrinter = NULL;
|
||
if ( mpQMtf )
|
||
{
|
||
mpQMtf->Clear();
|
||
delete mpQMtf;
|
||
mpQMtf = NULL;
|
||
}
|
||
EndPrint();
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
#else
|
||
if ( mpPrinter )
|
||
{
|
||
CHECK_FOR_RVPSYNC_NORMAL();
|
||
try
|
||
{
|
||
mpPrinter->mxPrintSpooler->AbortJob();
|
||
}
|
||
catch( RuntimeException &e )
|
||
{
|
||
rvpExceptionHandler();
|
||
}
|
||
if ( mpQMtf )
|
||
{
|
||
mpQMtf->Clear();
|
||
delete mpQMtf;
|
||
mpQMtf = NULL;
|
||
}
|
||
|
||
mbPrinting = FALSE;
|
||
mnCurPage = 0;
|
||
mnCurPrintPage = 0;
|
||
maJobName.Erase();
|
||
ImplDeletePrintSpooler( mpPrinter );
|
||
mpPrinter = NULL;
|
||
EndPrint();
|
||
|
||
return TRUE;
|
||
}
|
||
#endif
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::StartPage()
|
||
{
|
||
if ( !IsJobActive() )
|
||
return FALSE;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
if ( mpPrinter || mpQPrinter )
|
||
{
|
||
if ( mpPrinter )
|
||
{
|
||
SalGraphics* pGraphics = mpPrinter->StartPage( maJobSetup.ImplGetConstData(), mbNewJobSetup );
|
||
if ( pGraphics )
|
||
{
|
||
ImplReleaseGraphics();
|
||
mpJobGraphics = pGraphics;
|
||
}
|
||
mbDevOutput = TRUE;
|
||
}
|
||
else
|
||
{
|
||
ImplGetGraphics();
|
||
mpJobGraphics = mpGraphics;
|
||
}
|
||
|
||
// PrintJob not aborted ???
|
||
if ( IsJobActive() )
|
||
{
|
||
mbInPrintPage = TRUE;
|
||
mnCurPage++;
|
||
if ( mpQPrinter )
|
||
{
|
||
mpQPrinter->SetPrinterOptions( *mpPrinterOptions );
|
||
mpQMtf = new GDIMetaFile;
|
||
mpQMtf->Record( this );
|
||
mpQMtf->SaveStatus();
|
||
}
|
||
else
|
||
{
|
||
mnCurPrintPage++;
|
||
PrintPage();
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
#else
|
||
if ( mpPrinter )
|
||
{
|
||
mpQMtf = new GDIMetaFile;
|
||
mpQMtf->Record( this );
|
||
mpQMtf->SaveStatus();
|
||
|
||
mbInPrintPage = TRUE;
|
||
mnCurPage++;
|
||
mnCurPrintPage++;
|
||
PrintPage();
|
||
|
||
return TRUE;
|
||
}
|
||
#endif
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
// -----------------------------------------------------------------------
|
||
|
||
BOOL Printer::EndPage()
|
||
{
|
||
if ( !IsJobActive() )
|
||
return FALSE;
|
||
|
||
#ifdef DO_TAB_CHECK
|
||
if( mpPrinter )
|
||
doTab( this );
|
||
#endif
|
||
|
||
mbInPrintPage = FALSE;
|
||
|
||
#ifndef REMOTE_APPSERVER
|
||
if ( mpPrinter || mpQPrinter )
|
||
{
|
||
if ( mpPrinter )
|
||
{
|
||
mpPrinter->EndPage();
|
||
ImplReleaseGraphics();
|
||
mbDevOutput = FALSE;
|
||
}
|
||
else if ( mpQPrinter )
|
||
{
|
||
// Eigentuemeruebergang an QPrinter
|
||
mpQMtf->Stop();
|
||
mpQMtf->WindStart();
|
||
GDIMetaFile* pPage = mpQMtf;
|
||
mpQMtf = NULL;
|
||
mpQPrinter->AddQueuePage( pPage, mnCurPage, mbNewJobSetup );
|
||
}
|
||
|
||
mpJobGraphics = NULL;
|
||
mbNewJobSetup = FALSE;
|
||
|
||
return TRUE;
|
||
}
|
||
#else
|
||
if ( mpPrinter && mpQMtf )
|
||
{
|
||
mpQMtf->Stop();
|
||
mpQMtf->WindStart();
|
||
|
||
PrinterPage aPage( mpQMtf, mbNewJobSetup, GetJobSetup() );
|
||
NMSP_CLIENT::RmPrinterPage aRmPage;
|
||
PRINTERSEQ_SET( aPage, aRmPage, NMSP_CLIENT::RmPrinterPage );
|
||
CHECK_FOR_RVPSYNC_NORMAL();
|
||
try
|
||
{
|
||
mpPrinter->mxPrintSpooler->SpoolPage( aRmPage );
|
||
}
|
||
catch( RuntimeException &e )
|
||
{
|
||
rvpExceptionHandler();
|
||
}
|
||
mpQMtf = NULL;
|
||
mbNewJobSetup = FALSE;
|
||
|
||
return TRUE;
|
||
}
|
||
#endif
|
||
|
||
return FALSE;
|
||
}
|