From 359e2be93a4560a86237f076003c23a6635fb1bb Mon Sep 17 00:00:00 2001 From: Xisco Fauli Date: Wed, 5 Jul 2023 11:29:34 +0200 Subject: starmath: check GetEditWindow() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it might return nullptr See https://crashreport.libreoffice.org/stats/signature/SmPrintOptionsTabPage::~SmPrintOptionsTabPage() Change-Id: I4b34b0da3dc282ae89fd58defa12045c34a12cfb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154026 Reviewed-by: Caolán McNamara Tested-by: Xisco Fauli Reviewed-by: Xisco Fauli --- starmath/source/dialog.cxx | 6 +- starmath/source/view.cxx | 136 +++++++++++++++++++++++---------------------- 2 files changed, 73 insertions(+), 69 deletions(-) diff --git a/starmath/source/dialog.cxx b/starmath/source/dialog.cxx index ecb68dbf2d63..03bbc60da66a 100644 --- a/starmath/source/dialog.cxx +++ b/starmath/source/dialog.cxx @@ -182,7 +182,8 @@ SmPrintOptionsTabPage::SmPrintOptionsTabPage(weld::Container* pPage, weld::Dialo SmPrintOptionsTabPage::~SmPrintOptionsTabPage() { if (SmViewShell *pViewSh = SmGetActiveView()) - pViewSh->GetEditWindow()->UpdateStatus(); + if (SmEditWindow* pEdit = pViewSh->GetEditWindow()) + pEdit->UpdateStatus(); } bool SmPrintOptionsTabPage::FillItemSet(SfxItemSet* rSet) @@ -206,7 +207,8 @@ bool SmPrintOptionsTabPage::FillItemSet(SfxItemSet* rSet) rSet->Put(SfxUInt16Item(SID_SMEDITWINDOWZOOM, sal::static_int_cast(m_xSmZoom->get_value(FieldUnit::PERCENT)))); if (SmViewShell *pViewSh = SmGetActiveView()) - pViewSh->GetEditWindow()->UpdateStatus(); + if (SmEditWindow* pEdit = pViewSh->GetEditWindow()) + pEdit->UpdateStatus(); return true; } diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx index d056e4c86ee7..a67745184e34 100644 --- a/starmath/source/view.cxx +++ b/starmath/source/view.cxx @@ -415,8 +415,8 @@ void SmGraphicWidget::GetFocus() { if (!SmViewShell::IsInlineEditEnabled()) return; - if (GetView().GetEditWindow()) - GetView().GetEditWindow()->Flush(); + if (SmEditWindow* pEdit = GetView().GetEditWindow()) + pEdit->Flush(); //Let view shell know what insertions should be done in visual editor GetView().SetInsertIntoEditWindow(false); SetIsCursorVisible(true); @@ -591,8 +591,7 @@ void SmGraphicWidget::Paint(vcl::RenderContext& rRenderContext, const tools::Rec { SetIsCursorVisible(false); // (old) cursor must be drawn again - const SmEditWindow* pEdit = GetView().GetEditWindow(); - if (pEdit) + if (const SmEditWindow* pEdit = GetView().GetEditWindow()) { // get new position for formula-cursor (for possible altered formula) sal_Int32 nRow; sal_uInt16 nCol; @@ -1568,8 +1567,9 @@ void SmViewShell::ShowError(const SmErrorDesc* pErrorDesc) if (pErrorDesc || nullptr != (pErrorDesc = GetDoc()->GetParser()->GetError()) ) { SetStatusText( pErrorDesc->m_aText ); - GetEditWindow()->MarkError( Point( pErrorDesc->m_pNode->GetColumn(), - pErrorDesc->m_pNode->GetRow())); + if (SmEditWindow* pEdit = GetEditWindow()) + pEdit->MarkError( Point( pErrorDesc->m_pNode->GetColumn(), + pErrorDesc->m_pNode->GetRow())); } } @@ -1612,8 +1612,7 @@ void SmViewShell::Insert( SfxMedium& rMedium ) return; OUString aText = pDoc->GetText(); - SmEditWindow *pEditWin = GetEditWindow(); - if (pEditWin) + if (SmEditWindow *pEditWin = GetEditWindow()) pEditWin->InsertText( aText ); else { @@ -1649,8 +1648,7 @@ void SmViewShell::InsertFrom(SfxMedium &rMedium) return; OUString aText = pDoc->GetText(); - SmEditWindow *pEditWin = GetEditWindow(); - if (pEditWin) + if (SmEditWindow *pEditWin = GetEditWindow()) pEditWin->InsertText(aText); else SAL_WARN( "starmath", "EditWindow missing" ); @@ -1720,8 +1718,8 @@ void SmViewShell::Execute(SfxRequest& rReq) auto pTrans = dynamic_cast(xTrans.get()); if (pTrans) { - SmEditWindow *pEditWin = GetEditWindow(); - pTrans->CopyToClipboard(pEditWin->GetClipboard()); + if (pWin) + pTrans->CopyToClipboard(pWin->GetClipboard()); } } } @@ -1729,15 +1727,17 @@ void SmViewShell::Execute(SfxRequest& rReq) case SID_PASTEOBJECT: { - SmEditWindow *pEditWin = GetEditWindow(); - TransferableDataHelper aData(TransferableDataHelper::CreateFromClipboard(pEditWin->GetClipboard())); uno::Reference < io::XInputStream > xStrm; - SotClipboardFormatId nId; - if( aData.GetTransferable().is() && - ( aData.HasFormat( nId = SotClipboardFormatId::EMBEDDED_OBJ ) || - (aData.HasFormat( SotClipboardFormatId::OBJECTDESCRIPTOR ) && - aData.HasFormat( nId = SotClipboardFormatId::EMBED_SOURCE )))) - xStrm = aData.GetInputStream(nId, OUString()); + if (pWin) + { + TransferableDataHelper aData(TransferableDataHelper::CreateFromClipboard(pWin->GetClipboard())); + SotClipboardFormatId nId; + if( aData.GetTransferable().is() && + ( aData.HasFormat( nId = SotClipboardFormatId::EMBEDDED_OBJ ) || + (aData.HasFormat( SotClipboardFormatId::OBJECTDESCRIPTOR ) && + aData.HasFormat( nId = SotClipboardFormatId::EMBED_SOURCE )))) + xStrm = aData.GetInputStream(nId, OUString()); + } if (xStrm.is()) { @@ -1782,16 +1782,18 @@ void SmViewShell::Execute(SfxRequest& rReq) bool bCallExec = nullptr == pWin; if( !bCallExec ) { - SmEditWindow *pEditWin = GetEditWindow(); - TransferableDataHelper aDataHelper( - TransferableDataHelper::CreateFromClipboard( - pEditWin->GetClipboard())); + if (pWin) + { + TransferableDataHelper aDataHelper( + TransferableDataHelper::CreateFromClipboard( + pWin->GetClipboard())); - if( aDataHelper.GetTransferable().is() && - aDataHelper.HasFormat( SotClipboardFormatId::STRING )) - pWin->Paste(); - else - bCallExec = true; + if( aDataHelper.GetTransferable().is() && + aDataHelper.HasFormat( SotClipboardFormatId::STRING )) + pWin->Paste(); + else + bCallExec = true; + } } if( bCallExec ) { @@ -1851,53 +1853,55 @@ void SmViewShell::Execute(SfxRequest& rReq) case SID_IMPORT_MATHML_CLIPBOARD: { - SmEditWindow *pEditWin = GetEditWindow(); - TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromClipboard(pEditWin->GetClipboard())); - uno::Reference < io::XInputStream > xStrm; - if ( aDataHelper.GetTransferable().is() ) + if (pWin) { - SotClipboardFormatId nId = SotClipboardFormatId::MATHML; - if (aDataHelper.HasFormat(nId)) + TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromClipboard(pWin->GetClipboard())); + uno::Reference < io::XInputStream > xStrm; + if ( aDataHelper.GetTransferable().is() ) { - xStrm = aDataHelper.GetInputStream(nId, ""); - if (xStrm.is()) - { - SfxMedium aClipboardMedium; - aClipboardMedium.GetItemSet(); //generate initial itemset, not sure if necessary - std::shared_ptr pMathFilter = - SfxFilter::GetFilterByName(MATHML_XML); - aClipboardMedium.SetFilter(pMathFilter); - aClipboardMedium.setStreamToLoadFrom(xStrm, true /*bIsReadOnly*/); - InsertFrom(aClipboardMedium); - GetDoc()->UpdateText(); - } - } - else - { - nId = SotClipboardFormatId::STRING; + SotClipboardFormatId nId = SotClipboardFormatId::MATHML; if (aDataHelper.HasFormat(nId)) { - // In case of FORMAT_STRING no stream exists, need to generate one - OUString aString; - if (aDataHelper.GetString( nId, aString)) + xStrm = aDataHelper.GetInputStream(nId, ""); + if (xStrm.is()) { - // tdf#117091 force xml declaration to exist - if (!aString.startsWith("\n" + aString; - SfxMedium aClipboardMedium; - aClipboardMedium.GetItemSet(); //generates initial itemset, not sure if necessary + aClipboardMedium.GetItemSet(); //generate initial itemset, not sure if necessary std::shared_ptr pMathFilter = SfxFilter::GetFilterByName(MATHML_XML); aClipboardMedium.SetFilter(pMathFilter); - - SvMemoryStream aStrm( const_cast(aString.getStr()), aString.getLength() * sizeof(sal_Unicode), StreamMode::READ); - uno::Reference xStrm2( new ::utl::OInputStreamWrapper(aStrm) ); - aClipboardMedium.setStreamToLoadFrom(xStrm2, true /*bIsReadOnly*/); + aClipboardMedium.setStreamToLoadFrom(xStrm, true /*bIsReadOnly*/); InsertFrom(aClipboardMedium); GetDoc()->UpdateText(); } } + else + { + nId = SotClipboardFormatId::STRING; + if (aDataHelper.HasFormat(nId)) + { + // In case of FORMAT_STRING no stream exists, need to generate one + OUString aString; + if (aDataHelper.GetString( nId, aString)) + { + // tdf#117091 force xml declaration to exist + if (!aString.startsWith("\n" + aString; + + SfxMedium aClipboardMedium; + aClipboardMedium.GetItemSet(); //generates initial itemset, not sure if necessary + std::shared_ptr pMathFilter = + SfxFilter::GetFilterByName(MATHML_XML); + aClipboardMedium.SetFilter(pMathFilter); + + SvMemoryStream aStrm( const_cast(aString.getStr()), aString.getLength() * sizeof(sal_Unicode), StreamMode::READ); + uno::Reference xStrm2( new ::utl::OInputStreamWrapper(aStrm) ); + aClipboardMedium.setStreamToLoadFrom(xStrm2, true /*bIsReadOnly*/); + InsertFrom(aClipboardMedium); + GetDoc()->UpdateText(); + } + } + } } } break; @@ -2240,16 +2244,14 @@ SmViewShell::~SmViewShell() //!! this view shell is not active anymore !! // Thus 'SmGetActiveView' will give a 0 pointer. // Thus we need to supply this view as argument - SmEditWindow *pEditWin = GetEditWindow(); - if (pEditWin) + if (SmEditWindow *pEditWin = GetEditWindow()) pEditWin->DeleteEditView(); mxGraphicWindow.disposeAndClear(); } void SmViewShell::Deactivate( bool bIsMDIActivate ) { - SmEditWindow *pEdit = GetEditWindow(); - if ( pEdit ) + if (SmEditWindow *pEdit = GetEditWindow()) pEdit->Flush(); SfxViewShell::Deactivate( bIsMDIActivate ); -- cgit