basctl/source/basicide/basdoc.cxx | 4 desktop/source/splash/splash.cxx | 140 +++++++++++++++------------ sfx2/source/view/viewprn.cxx | 9 - starmath/source/unomodel.cxx | 2 svtools/source/dialogs/prnsetup.cxx | 10 + sw/source/uibase/uno/SwXDocumentSettings.cxx | 2 vcl/source/outdev/map.cxx | 3 7 files changed, 100 insertions(+), 70 deletions(-)
New commits: commit ed1bd1867da5459dcefdc8f066aabe2ae5c08667 Author: Michael Meeks <michael.me...@collabora.com> Date: Fri Mar 20 23:08:41 2015 +0000 protect more printer code-paths. Change-Id: Ic5bc5c3325b460cba0d95484454c9bb826684890 diff --git a/basctl/source/basicide/basdoc.cxx b/basctl/source/basicide/basdoc.cxx index 2f00c5c..6e0c4de 100644 --- a/basctl/source/basicide/basdoc.cxx +++ b/basctl/source/basicide/basdoc.cxx @@ -51,7 +51,9 @@ DocShell::DocShell() } DocShell::~DocShell() -{ } +{ + pPrinter.disposeAndClear(); +} SfxPrinter* DocShell::GetPrinter( bool bCreate ) { diff --git a/sfx2/source/view/viewprn.cxx b/sfx2/source/view/viewprn.cxx index c9e5d0d..7e13153 100644 --- a/sfx2/source/view/viewprn.cxx +++ b/sfx2/source/view/viewprn.cxx @@ -628,7 +628,7 @@ Printer* SfxViewShell::GetActivePrinter() const void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq ) { sal_uInt16 nDialogRet = RET_CANCEL; - SfxPrinter* pPrinter = 0; + VclPtr<SfxPrinter> pPrinter; bool bSilent = false; // does the function have been called by the user interface or by an API call @@ -765,7 +765,7 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq ) // if printer is unknown, it can't be used - now printer from document will be used if ( !pPrinter->IsKnown() ) - DELETEZ(pPrinter); + pPrinter.disposeAndClear(); } if ( SID_PRINTER_NAME == nId ) @@ -807,7 +807,7 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq ) if ( !bIsAPI ) { // PrinterDialog needs a temporary printer - SfxPrinter* pDlgPrinter = pPrinter->Clone(); + VclPtr<SfxPrinter> pDlgPrinter = pPrinter->Clone(); nDialogRet = 0; // execute PrinterSetupDialog @@ -859,13 +859,12 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq ) // forget new printer, it was taken over (as pPrinter) or deleted pDlgPrinter = NULL; - } else { // PrinterDialog is used to transfer information on printing, // so it will only be deleted here if dialog was cancelled - DELETEZ( pDlgPrinter ); + pDlgPrinter.disposeAndClear(); rReq.Ignore(); } } diff --git a/starmath/source/unomodel.cxx b/starmath/source/unomodel.cxx index 2cee1b3..dfd260a 100644 --- a/starmath/source/unomodel.cxx +++ b/starmath/source/unomodel.cxx @@ -656,7 +656,7 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* SfxItemSet *pItemSet = new SfxItemSet( pDocSh->GetPool(), nRange ); SmModule *pp = SM_MOD(); pp->GetConfig()->ConfigToItemSet(*pItemSet); - SfxPrinter *pPrinter = SfxPrinter::Create ( aStream, pItemSet ); + VclPtr<SfxPrinter> pPrinter = SfxPrinter::Create ( aStream, pItemSet ); pDocSh->SetPrinter( pPrinter ); } diff --git a/svtools/source/dialogs/prnsetup.cxx b/svtools/source/dialogs/prnsetup.cxx index 72da5fd..84ed57f 100644 --- a/svtools/source/dialogs/prnsetup.cxx +++ b/svtools/source/dialogs/prnsetup.cxx @@ -53,8 +53,9 @@ void ImplFreePrnDlgListBox( ListBox* pBox, bool bClear ) Printer* ImplPrnDlgListBoxSelect( ListBox* pBox, PushButton* pPropBtn, - Printer* pPrinter, Printer* pTempPrinter ) + Printer* pPrinter, Printer* pTempPrinterIn ) { + VclPtr<Printer> pTempPrinter( pTempPrinterIn ); if ( pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND ) { const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), true ); @@ -73,7 +74,7 @@ Printer* ImplPrnDlgListBoxSelect( ListBox* pBox, PushButton* pPropBtn, if ( (pTempPrinter->GetName() != pInfo->GetPrinterName()) || (pTempPrinter->GetDriverName() != pInfo->GetDriver()) ) { - VclPtr<Printer>(pTempPrinter).disposeAndClear(); + pTempPrinter.disposeAndClear(); pTempPrinter = new Printer( *pInfo ); } } @@ -91,8 +92,9 @@ Printer* ImplPrnDlgListBoxSelect( ListBox* pBox, PushButton* pPropBtn, -Printer* ImplPrnDlgUpdatePrinter( Printer* pPrinter, Printer* pTempPrinter ) +Printer* ImplPrnDlgUpdatePrinter( Printer* pPrinter, Printer* pTempPrinterIn ) { + VclPtr<Printer> pTempPrinter( pTempPrinterIn ); OUString aPrnName; if ( pTempPrinter ) aPrnName = pTempPrinter->GetName(); @@ -101,7 +103,7 @@ Printer* ImplPrnDlgUpdatePrinter( Printer* pPrinter, Printer* pTempPrinter ) if ( ! Printer::GetQueueInfo( aPrnName, false ) ) { - VclPtr<Printer>(pTempPrinter).disposeAndClear(); + pTempPrinter.disposeAndClear(); pTempPrinter = new Printer; } diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx index dfd2cb1..f6f07f7 100644 --- a/sw/source/uibase/uno/SwXDocumentSettings.cxx +++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx @@ -425,7 +425,7 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf 0 }; SfxItemSet *pItemSet = new SfxItemSet( mpDoc->GetAttrPool(), nRange ); - SfxPrinter *pPrinter = SfxPrinter::Create ( aStream, pItemSet ); + VclPtr<SfxPrinter> pPrinter = SfxPrinter::Create ( aStream, pItemSet ); // set printer only once; in _postSetValues mpPrinter.disposeAndClear(); diff --git a/vcl/source/outdev/map.cxx b/vcl/source/outdev/map.cxx index 41909dc..dc57390 100644 --- a/vcl/source/outdev/map.cxx +++ b/vcl/source/outdev/map.cxx @@ -351,6 +351,9 @@ inline void ImplCalcMapResolution( const MapMode& rMapMode, // #i75163# void OutputDevice::ImplInvalidateViewTransform() { + if(!mpOutDevData) + return; + if(mpOutDevData->mpViewTransform) { delete mpOutDevData->mpViewTransform; commit c549b1bbb559deb2a9a8e5c571c380956b1ccd52 Author: Michael Meeks <michael.me...@collabora.com> Date: Fri Mar 20 23:06:40 2015 +0000 splash: de-confuse mixed VCL and UNO reference counting. Change-Id: I1c8ded2e5c5e8072111d3e1480ba7086db135810 diff --git a/desktop/source/splash/splash.cxx b/desktop/source/splash/splash.cxx index 1fdc406..73e9649 100644 --- a/desktop/source/splash/splash.cxx +++ b/desktop/source/splash/splash.cxx @@ -46,16 +46,31 @@ using namespace ::com::sun::star::uno; namespace { +class SplashScreen; + +class SplashScreenWindow : public IntroWindow +{ +public: + SplashScreen *pSpl; + ScopedVclPtr<VirtualDevice> _vdev; + SplashScreenWindow(SplashScreen *); + virtual ~SplashScreenWindow() { disposeOnce(); } + virtual void dispose() SAL_OVERRIDE; + // workwindow + virtual void Paint( const Rectangle& ) SAL_OVERRIDE; +}; + class SplashScreen : public ::cppu::WeakImplHelper3< XStatusIndicator, XInitialization, XServiceInfo > - , public IntroWindow { + friend SplashScreenWindow; private: enum BitmapMode { BM_FULLSCREEN, BM_DEFAULTMODE }; + VclPtr<SplashScreenWindow> pWindow; + DECL_LINK( AppEventListenerHdl, VclWindowEvent * ); virtual ~SplashScreen(); - virtual void dispose() SAL_OVERRIDE; void loadConfig(); void updateStatus(); void SetScreenBitmap(BitmapEx &rBitmap); @@ -63,7 +78,6 @@ private: static osl::Mutex _aMutex; - ScopedVclPtr<VirtualDevice> _vdev; BitmapEx _aIntroBmp; Color _cProgressFrameColor; Color _cProgressBarColor; @@ -112,14 +126,24 @@ public: virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE { return desktop::splash::getSupportedServiceNames(); } - - // workwindow - virtual void Paint( const Rectangle& ) SAL_OVERRIDE; }; -SplashScreen::SplashScreen() +SplashScreenWindow::SplashScreenWindow(SplashScreen *pSplash) : IntroWindow() - , _vdev(new VirtualDevice(*((IntroWindow*)this))) + , pSpl( pSplash ) + , _vdev(new VirtualDevice(*this)) +{ + _vdev->EnableRTL(IsRTLEnabled()); +} + +void SplashScreenWindow::dispose() +{ + pSpl = NULL; + IntroWindow::dispose(); +} + +SplashScreen::SplashScreen() + : pWindow( new SplashScreenWindow (this) ) , _cProgressFrameColor(sal::static_int_cast< ColorData >(NOT_LOADED)) , _cProgressBarColor(sal::static_int_cast< ColorData >(NOT_LOADED)) , _cProgressTextColor(sal::static_int_cast< ColorData >(NOT_LOADED)) @@ -149,20 +173,14 @@ SplashScreen::SplashScreen() , _yoffset(18) { loadConfig(); - _vdev->EnableRTL(IsRTLEnabled()); } SplashScreen::~SplashScreen() { - disposeOnce(); -} - -void SplashScreen::dispose() -{ Application::RemoveEventListener( LINK( this, SplashScreen, AppEventListenerHdl ) ); - Hide(); - IntroWindow::dispose(); + pWindow->Hide(); + pWindow.disposeAndClear(); } void SAL_CALL SplashScreen::start(const OUString&, sal_Int32 nRange) @@ -173,10 +191,10 @@ void SAL_CALL SplashScreen::start(const OUString&, sal_Int32 nRange) _bProgressEnd = false; SolarMutexGuard aSolarGuard; if ( _eBitmapMode == BM_FULLSCREEN ) - ShowFullScreenMode( true ); - Show(); - Paint(Rectangle()); - Flush(); + pWindow->ShowFullScreenMode( true ); + pWindow->Show(); + pWindow->Paint(Rectangle()); + pWindow->Flush(); } } @@ -187,8 +205,8 @@ void SAL_CALL SplashScreen::end() if (_bVisible ) { if ( _eBitmapMode == BM_FULLSCREEN ) - EndFullScreenMode(); - Hide(); + pWindow->EndFullScreenMode(); + pWindow->Hide(); } _bProgressEnd = true; } @@ -200,8 +218,8 @@ void SAL_CALL SplashScreen::reset() if (_bVisible && !_bProgressEnd ) { if ( _eBitmapMode == BM_FULLSCREEN ) - ShowFullScreenMode( true ); - Show(); + pWindow->ShowFullScreenMode( true ); + pWindow->Show(); updateStatus(); } } @@ -217,8 +235,8 @@ void SAL_CALL SplashScreen::setText(const OUString& rText) if (_bVisible && !_bProgressEnd) { if ( _eBitmapMode == BM_FULLSCREEN ) - ShowFullScreenMode( true ); - Show(); + pWindow->ShowFullScreenMode( true ); + pWindow->Show(); updateStatus(); } } @@ -233,11 +251,13 @@ void SAL_CALL SplashScreen::setValue(sal_Int32 nValue) SolarMutexGuard aSolarGuard; if (_bVisible && !_bProgressEnd) { if ( _eBitmapMode == BM_FULLSCREEN ) - ShowFullScreenMode( true ); - Show(); - if (nValue >= _iMax) _iProgress = _iMax; - else _iProgress = nValue; - updateStatus(); + pWindow->ShowFullScreenMode( true ); + pWindow->Show(); + if (nValue >= _iMax) + _iProgress = _iMax; + else + _iProgress = nValue; + updateStatus(); } } @@ -257,8 +277,8 @@ SplashScreen::initialize( const ::com::sun::star::uno::Sequence< ::com::sun::sta if ( _bShowLogo ) SetScreenBitmap (_aIntroBmp); Size aSize = _aIntroBmp.GetSizePixel(); - SetOutputSizePixel( aSize ); - _vdev->SetOutputSizePixel( aSize ); + pWindow->SetOutputSizePixel( aSize ); + pWindow->_vdev->SetOutputSizePixel( aSize ); _height = aSize.Height(); _width = aSize.Width(); if (_width > 500) @@ -328,10 +348,12 @@ SplashScreen::initialize( const ::com::sun::star::uno::Sequence< ::com::sun::sta void SplashScreen::updateStatus() { - if (!_bVisible || _bProgressEnd) return; - if (!_bPaintProgress) _bPaintProgress = true; - Paint(Rectangle()); - Flush(); + if (!_bVisible || _bProgressEnd) + return; + if (!_bPaintProgress) + _bPaintProgress = true; + pWindow->Paint(Rectangle()); + pWindow->Flush(); } // internal private methods @@ -342,7 +364,7 @@ IMPL_LINK( SplashScreen, AppEventListenerHdl, VclWindowEvent *, inEvent ) switch ( inEvent->GetId() ) { case VCLEVENT_WINDOW_SHOW: - Paint( Rectangle() ); + pWindow->Paint( Rectangle() ); break; default: break; @@ -583,18 +605,19 @@ void SplashScreen::determineProgressRatioValues( } } -void SplashScreen::Paint( const Rectangle&) +void SplashScreenWindow::Paint( const Rectangle&) { - if(!_bVisible) return; + if (!pSpl || !pSpl->_bVisible) + return; //native drawing // in case of native controls we need to draw directly to the window - if( _bNativeProgress && IsNativeControlSupported( CTRL_INTROPROGRESS, PART_ENTIRE_CONTROL ) ) + if( pSpl->_bNativeProgress && IsNativeControlSupported( CTRL_INTROPROGRESS, PART_ENTIRE_CONTROL ) ) { - DrawBitmapEx( Point(), _aIntroBmp ); + DrawBitmapEx( Point(), pSpl->_aIntroBmp ); - ImplControlValue aValue( _iProgress * _barwidth / _iMax); - Rectangle aDrawRect( Point(_tlx, _tly), Size( _barwidth, _barheight ) ); + ImplControlValue aValue( pSpl->_iProgress * pSpl->_barwidth / pSpl->_iMax); + Rectangle aDrawRect( Point(pSpl->_tlx, pSpl->_tly), Size( pSpl->_barwidth, pSpl->_barheight ) ); Rectangle aNativeControlRegion, aNativeContentRegion; if( GetNativeControlRegion( CTRL_INTROPROGRESS, PART_ENTIRE_CONTROL, aDrawRect, @@ -602,39 +625,40 @@ void SplashScreen::Paint( const Rectangle&) aNativeControlRegion, aNativeContentRegion ) ) { long nProgressHeight = aNativeControlRegion.GetHeight(); - aDrawRect.Top() -= (nProgressHeight - _barheight)/2; - aDrawRect.Bottom() += (nProgressHeight - _barheight)/2; + aDrawRect.Top() -= (nProgressHeight - pSpl->_barheight)/2; + aDrawRect.Bottom() += (nProgressHeight - pSpl->_barheight)/2; } if( (DrawNativeControl( CTRL_INTROPROGRESS, PART_ENTIRE_CONTROL, aDrawRect, - CTRL_STATE_ENABLED, aValue, _sProgressText )) ) + CTRL_STATE_ENABLED, aValue, pSpl->_sProgressText )) ) { return; } } - //non native drawing + + // non native drawing // draw bitmap - if (_bPaintBitmap) - _vdev->DrawBitmapEx( Point(), _aIntroBmp ); + if (pSpl->_bPaintBitmap) + _vdev->DrawBitmapEx( Point(), pSpl->_aIntroBmp ); - if (_bPaintProgress) { + if (pSpl->_bPaintProgress) { // draw progress... - long length = (_iProgress * _barwidth / _iMax) - (2 * _barspace); + long length = (pSpl->_iProgress * pSpl->_barwidth / pSpl->_iMax) - (2 * pSpl->_barspace); if (length < 0) length = 0; // border _vdev->SetFillColor(); - _vdev->SetLineColor( _cProgressFrameColor ); - _vdev->DrawRect(Rectangle(_tlx, _tly, _tlx+_barwidth, _tly+_barheight)); - _vdev->SetFillColor( _cProgressBarColor ); + _vdev->SetLineColor( pSpl->_cProgressFrameColor ); + _vdev->DrawRect(Rectangle(pSpl->_tlx, pSpl->_tly, pSpl->_tlx+pSpl->_barwidth, pSpl->_tly+pSpl->_barheight)); + _vdev->SetFillColor( pSpl->_cProgressBarColor ); _vdev->SetLineColor(); - _vdev->DrawRect(Rectangle(_tlx+_barspace, _tly+_barspace, _tlx+_barspace+length, _tly+_barheight-_barspace)); + _vdev->DrawRect(Rectangle(pSpl->_tlx+pSpl->_barspace, pSpl->_tly+pSpl->_barspace, pSpl->_tlx+pSpl->_barspace+length, pSpl->_tly+pSpl->_barheight-pSpl->_barspace)); vcl::Font aFont; aFont.SetSize(Size(0, 12)); aFont.SetAlign(ALIGN_BASELINE); _vdev->SetFont(aFont); - _vdev->SetTextColor(_cProgressTextColor); - _vdev->DrawText(Point(_tlx, _textBaseline), _sProgressText); + _vdev->SetTextColor(pSpl->_cProgressTextColor); + _vdev->DrawText(Point(pSpl->_tlx, pSpl->_textBaseline), pSpl->_sProgressText); } DrawOutDev(Point(), GetOutputSizePixel(), Point(), _vdev->GetOutputSizePixel(), *_vdev.get() ); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits