From 9b1f48c1baa2d80bf968ab1ec1f07f68db41fd89 Mon Sep 17 00:00:00 2001 From: Ivo Hinkelmann Date: Wed, 20 Dec 2006 17:32:13 +0000 Subject: [PATCH] INTEGRATION: CWS prdiscw (1.57.94); FILE MERGED 2006/12/05 08:50:30 pl 1.57.94.4: #i71571# remove completely broken assignment operator 2006/11/15 16:59:34 pl 1.57.94.3: #i71571# new printer enumeration 2006/11/15 15:18:36 pl 1.57.94.2: #i65167# add: GetPrinterQueueInfo for a named printer 2006/11/09 18:12:06 pl 1.57.94.1: #i65167# force printer update --- vcl/source/gdi/print.cxx | 260 +++++++++++++++++++++------------------ 1 file changed, 139 insertions(+), 121 deletions(-) diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx index 74a529093dca..0f65316d40bf 100644 --- a/vcl/source/gdi/print.cxx +++ b/vcl/source/gdi/print.cxx @@ -4,9 +4,9 @@ * * $RCSfile: print.cxx,v $ * - * $Revision: 1.57 $ + * $Revision: 1.58 $ * - * last change: $Author: obo $ $Date: 2006-09-17 12:09:37 $ + * last change: $Author: ihi $ $Date: 2006-12-20 18:32:13 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -231,15 +231,15 @@ QueueInfo::~QueueInfo() // ----------------------------------------------------------------------- -const QueueInfo& QueueInfo::operator==( const QueueInfo& rInfo ) +bool QueueInfo::operator==( const QueueInfo& rInfo ) const { - maPrinterName = rInfo.maPrinterName; - maDriver = rInfo.maDriver; - maLocation = rInfo.maLocation; - maComment = rInfo.maComment; - mnStatus = rInfo.mnStatus; - mnJobs = rInfo.mnJobs; - return *this; + return + maPrinterName == rInfo.maPrinterName && + maDriver == rInfo.maDriver && + maLocation == rInfo.maLocation && + maComment == rInfo.maComment && + mnStatus == rInfo.mnStatus && + mnJobs == rInfo.mnJobs; } // ----------------------------------------------------------------------- @@ -291,12 +291,50 @@ SalPrinterQueueInfo::~SalPrinterQueueInfo() // ----------------------------------------------------------------------- +ImplPrnQueueList::~ImplPrnQueueList() +{ + ImplSVData* pSVData = ImplGetSVData(); + for( unsigned int i = 0; i < m_aQueueInfos.size(); i++ ) + { + delete m_aQueueInfos[i].mpQueueInfo; + pSVData->mpDefInst->DeletePrinterQueueInfo( m_aQueueInfos[i].mpSalQueueInfo ); + } +} + +// ----------------------------------------------------------------------- + void ImplPrnQueueList::Add( SalPrinterQueueInfo* pData ) { - ImplPrnQueueData* pInfo = new ImplPrnQueueData; - pInfo->mpQueueInfo = NULL; - pInfo->mpSalQueueInfo = pData; - List::Insert( (void*)pInfo, LIST_APPEND ); + std::hash_map< rtl::OUString, sal_Int32, rtl::OUStringHash >::iterator it = + m_aNameToIndex.find( pData->maPrinterName ); + if( it == m_aNameToIndex.end() ) + { + m_aNameToIndex[ pData->maPrinterName ] = m_aQueueInfos.size(); + m_aQueueInfos.push_back( ImplPrnQueueData() ); + m_aQueueInfos.back().mpQueueInfo = NULL; + m_aQueueInfos.back().mpSalQueueInfo = pData; + m_aPrinterList.push_back( pData->maPrinterName ); + } + else // this should not happen, but ... + { + ImplPrnQueueData& rData = m_aQueueInfos[ it->second ]; + delete rData.mpQueueInfo; + rData.mpQueueInfo = NULL; + ImplGetSVData()->mpDefInst->DeletePrinterQueueInfo( rData.mpSalQueueInfo ); + rData.mpSalQueueInfo = pData; + } +} + +// ----------------------------------------------------------------------- + +ImplPrnQueueData* ImplPrnQueueList::Get( const rtl::OUString& rPrinter ) +{ + ImplPrnQueueData* pData = NULL; + std::hash_map::iterator it = + m_aNameToIndex.find( rPrinter ); + if( it != m_aNameToIndex.end() ) + pData = &m_aQueueInfos[it->second]; + return pData; } // ======================================================================= @@ -319,18 +357,6 @@ void ImplDeletePrnQueueList() if ( pPrnList ) { - ImplPrnQueueData* pInfo = pPrnList->First(); - while ( pInfo ) - { - if ( pInfo->mpQueueInfo ) - delete pInfo->mpQueueInfo; - - pSVData->mpDefInst->DeletePrinterQueueInfo( pInfo->mpSalQueueInfo ); - - delete pInfo; - pInfo = pPrnList->Next(); - } - delete pPrnList; pSVData->maGDIData.mpPrinterQueueList = NULL; } @@ -338,50 +364,40 @@ void ImplDeletePrnQueueList() // ----------------------------------------------------------------------- -USHORT Printer::GetQueueCount() +const std::vector& Printer::GetPrinterQueues() +{ + ImplSVData* pSVData = ImplGetSVData(); + if ( !pSVData->maGDIData.mpPrinterQueueList ) + ImplInitPrnQueueList(); + return pSVData->maGDIData.mpPrinterQueueList->m_aPrinterList; +} + +// ----------------------------------------------------------------------- +const QueueInfo* Printer::GetQueueInfo( const String& rPrinterName, bool bStatusUpdate ) { ImplSVData* pSVData = ImplGetSVData(); if ( !pSVData->maGDIData.mpPrinterQueueList ) ImplInitPrnQueueList(); - return (USHORT)(pSVData->maGDIData.mpPrinterQueueList->Count()); -} + ImplPrnQueueData* pInfo = pSVData->maGDIData.mpPrinterQueueList->Get( rPrinterName ); + if( pInfo ) + { + if( !pInfo->mpQueueInfo || bStatusUpdate ) + pSVData->mpDefInst->GetPrinterQueueState( pInfo->mpSalQueueInfo ); -// ----------------------------------------------------------------------- + if ( !pInfo->mpQueueInfo ) + pInfo->mpQueueInfo = new QueueInfo; -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 ); - - if ( bStatus ) - pSVData->mpDefInst->GetPrinterQueueState( pInfo->mpSalQueueInfo ); - - 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; + 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; + } + return NULL; } // ----------------------------------------------------------------------- @@ -515,76 +531,37 @@ SalPrinterQueueInfo* Printer::ImplGetQueueInfo( const XubString& rPrinterName, ImplInitPrnQueueList(); ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList; - if ( pPrnList && pPrnList->Count() ) + if ( pPrnList && pPrnList->m_aQueueInfos.size() ) { - // Zuerst suchen wir nach dem Printer-Namen - ImplPrnQueueData* pBestInfo = NULL; - ImplPrnQueueData* pInfo = pPrnList->First(); - while ( pInfo ) + // first search for the printer name driectly + ImplPrnQueueData* pInfo = pPrnList->Get( rPrinterName ); + if( pInfo ) + return pInfo->mpSalQueueInfo; + + // then search case insensitive + for( unsigned int i = 0; i < pPrnList->m_aQueueInfos.size(); i++ ) { - if ( pInfo->mpSalQueueInfo->maPrinterName == rPrinterName ) - { - pBestInfo = pInfo; - if ( !pDriver || (pInfo->mpSalQueueInfo->maDriver == *pDriver) ) - return pInfo->mpSalQueueInfo; - } - pInfo = pPrnList->Next(); + if( pPrnList->m_aQueueInfos[i].mpSalQueueInfo->maPrinterName.EqualsIgnoreCaseAscii( rPrinterName ) ) + return pPrnList->m_aQueueInfos[i].mpSalQueueInfo; } - // 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 + // then search for driver name if ( pDriver ) { - pInfo = pPrnList->First(); - while ( pInfo ) + for( unsigned int i = 0; i < pPrnList->m_aQueueInfos.size(); i++ ) { - if ( pInfo->mpSalQueueInfo->maDriver == *pDriver ) - return pInfo->mpSalQueueInfo; - pInfo = pPrnList->Next(); + if( pPrnList->m_aQueueInfos[i].mpSalQueueInfo->maDriver == *pDriver ) + return pPrnList->m_aQueueInfos[i].mpSalQueueInfo; } } - // 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 ) + // then the default printer + pInfo = pPrnList->Get( GetDefaultPrinterName() ); + if( pInfo ) return pInfo->mpSalQueueInfo; + + // last chance: the first available printer + return pPrnList->m_aQueueInfos[0].mpSalQueueInfo; } return NULL; @@ -1701,3 +1678,44 @@ BOOL Printer::EndPage() return FALSE; } + +// ----------------------------------------------------------------------- + +void Printer::updatePrinters() +{ + ImplSVData* pSVData = ImplGetSVData(); + ImplPrnQueueList* pPrnList = pSVData->maGDIData.mpPrinterQueueList; + + if ( pPrnList ) + { + ImplPrnQueueList* pNewList = new ImplPrnQueueList; + pSVData->mpDefInst->GetPrinterQueueInfo( pNewList ); + + bool bChanged = pPrnList->m_aQueueInfos.size() != pNewList->m_aQueueInfos.size(); + for( unsigned int i = 0; ! bChanged && i < pPrnList->m_aQueueInfos.size(); i++ ) + { + ImplPrnQueueData& rInfo = pPrnList->m_aQueueInfos[i]; + ImplPrnQueueData& rNewInfo = pNewList->m_aQueueInfos[i]; + if( ! rInfo.mpSalQueueInfo || ! rNewInfo.mpSalQueueInfo || // sanity check + rInfo.mpSalQueueInfo->maPrinterName != rNewInfo.mpSalQueueInfo->maPrinterName ) + { + bChanged = true; + } + } + if( bChanged ) + { + ImplDeletePrnQueueList(); + pSVData->maGDIData.mpPrinterQueueList = pNewList; + + Application* pApp = GetpApp(); + if( pApp ) + { + DataChangedEvent aDCEvt( DATACHANGED_PRINTER ); + pApp->DataChanged( aDCEvt ); + pApp->NotifyAllWindows( aDCEvt ); + } + } + else + delete pNewList; + } +}