From dae6572c54a952d9da94261852496dc72fe51d92 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Thu, 22 Jan 2015 12:47:29 +0100 Subject: [PATCH] rhbz#1184582: At least catch and log UNO exceptions in grammar checking thread (cherry picked from commit b1dbc511eeaf88e3b4b5a8a2dce129d251d2dcb6) Conflicts: linguistic/source/gciterator.cxx Change-Id: I87744f86d1413973709a46a58ebc03a39bce842c --- linguistic/source/gciterator.cxx | 110 +++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 50 deletions(-) diff --git a/linguistic/source/gciterator.cxx b/linguistic/source/gciterator.cxx index 41018e3..d3759eb 100644 --- a/linguistic/source/gciterator.cxx +++ b/linguistic/source/gciterator.cxx @@ -545,70 +545,80 @@ void GrammarCheckingIterator::DequeueAndCheck() if (xFlatPara.is() && xFPIterator.is()) { - OUString aCurTxt( xFlatPara->getText() ); - lang::Locale aCurLocale = lcl_GetPrimaryLanguageOfSentence( xFlatPara, aFPEntryItem.m_nStartIndex ); - - bModified = xFlatPara->isModified(); - if (!bModified) + try { - // ---- THREAD SAFE START ---- - ::osl::ClearableGuard< ::osl::Mutex > aGuard( MyMutex::get() ); + OUString aCurTxt( xFlatPara->getText() ); + lang::Locale aCurLocale = lcl_GetPrimaryLanguageOfSentence( xFlatPara, aFPEntryItem.m_nStartIndex ); - sal_Int32 nStartPos = aFPEntryItem.m_nStartIndex; - sal_Int32 nSuggestedEnd = GetSuggestedEndOfSentence( aCurTxt, nStartPos, aCurLocale ); - DBG_ASSERT( (nSuggestedEnd == 0 && aCurTxt.isEmpty()) || nSuggestedEnd > nStartPos, - "nSuggestedEndOfSentencePos calculation failed?" ); + bModified = xFlatPara->isModified(); + if (!bModified) + { + // ---- THREAD SAFE START ---- + ::osl::ClearableGuard< ::osl::Mutex > aGuard( MyMutex::get() ); - linguistic2::ProofreadingResult aRes; + sal_Int32 nStartPos = aFPEntryItem.m_nStartIndex; + sal_Int32 nSuggestedEnd = GetSuggestedEndOfSentence( aCurTxt, nStartPos, aCurLocale ); + DBG_ASSERT( (nSuggestedEnd == 0 && aCurTxt.isEmpty()) || nSuggestedEnd > nStartPos, + "nSuggestedEndOfSentencePos calculation failed?" ); - uno::Reference< linguistic2::XProofreader > xGC( GetGrammarChecker( aCurLocale ), uno::UNO_QUERY ); - if (xGC.is()) - { - aGuard.clear(); - uno::Sequence const aProps( + linguistic2::ProofreadingResult aRes; + + uno::Reference< linguistic2::XProofreader > xGC( GetGrammarChecker( aCurLocale ), uno::UNO_QUERY ); + if (xGC.is()) + { + aGuard.clear(); + uno::Sequence const aProps( lcl_makeProperties(xFlatPara)); - aRes = xGC->doProofreading( aCurDocId, aCurTxt, - aCurLocale, nStartPos, nSuggestedEnd, aProps ); - - //!! work-around to prevent looping if the grammar checker - //!! failed to properly identify the sentence end - if ( - aRes.nBehindEndOfSentencePosition <= nStartPos && - aRes.nBehindEndOfSentencePosition != nSuggestedEnd - ) + aRes = xGC->doProofreading( aCurDocId, aCurTxt, + aCurLocale, nStartPos, nSuggestedEnd, aProps ); + + //!! work-around to prevent looping if the grammar checker + //!! failed to properly identify the sentence end + if ( + aRes.nBehindEndOfSentencePosition <= nStartPos && + aRes.nBehindEndOfSentencePosition != nSuggestedEnd + ) + { + DBG_ASSERT( false, "!! Grammarchecker failed to provide end of sentence !!" ); + aRes.nBehindEndOfSentencePosition = nSuggestedEnd; + } + + aRes.xFlatParagraph = xFlatPara; + aRes.nStartOfSentencePosition = nStartPos; + } + else { - DBG_ASSERT( false, "!! Grammarchecker failed to provide end of sentence !!" ); - aRes.nBehindEndOfSentencePosition = nSuggestedEnd; + // no grammar checker -> no error + // but we need to provide the data below in order to continue with the next sentence + aRes.aDocumentIdentifier = aCurDocId; + aRes.xFlatParagraph = xFlatPara; + aRes.aText = aCurTxt; + aRes.aLocale = aCurLocale; + aRes.nStartOfSentencePosition = nStartPos; + aRes.nBehindEndOfSentencePosition = nSuggestedEnd; } + aRes.nStartOfNextSentencePosition = lcl_SkipWhiteSpaces( aCurTxt, aRes.nBehindEndOfSentencePosition ); + aRes.nBehindEndOfSentencePosition = lcl_BacktraceWhiteSpaces( aCurTxt, aRes.nStartOfNextSentencePosition ); - aRes.xFlatParagraph = xFlatPara; - aRes.nStartOfSentencePosition = nStartPos; + //guard has to be cleared as ProcessResult calls out of this class + aGuard.clear(); + ProcessResult( aRes, xFPIterator, aFPEntryItem.m_bAutomatic ); + // ---- THREAD SAFE END ---- } else { - // no grammar checker -> no error - // but we need to provide the data below in order to continue with the next sentence - aRes.aDocumentIdentifier = aCurDocId; - aRes.xFlatParagraph = xFlatPara; - aRes.aText = aCurTxt; - aRes.aLocale = aCurLocale; - aRes.nStartOfSentencePosition = nStartPos; - aRes.nBehindEndOfSentencePosition = nSuggestedEnd; + // the paragraph changed meanwhile... (and maybe is still edited) + // thus we simply continue to ask for the next to be checked. + uno::Reference< text::XFlatParagraph > xFlatParaNext( xFPIterator->getNextPara() ); + AddEntry( xFPIterator, xFlatParaNext, aCurDocId, 0, aFPEntryItem.m_bAutomatic ); } - aRes.nStartOfNextSentencePosition = lcl_SkipWhiteSpaces( aCurTxt, aRes.nBehindEndOfSentencePosition ); - aRes.nBehindEndOfSentencePosition = lcl_BacktraceWhiteSpaces( aCurTxt, aRes.nStartOfNextSentencePosition ); - - //guard has to be cleared as ProcessResult calls out of this class - aGuard.clear(); - ProcessResult( aRes, xFPIterator, aFPEntryItem.m_bAutomatic ); - // ---- THREAD SAFE END ---- } - else + catch (css::uno::Exception & e) { - // the paragraph changed meanwhile... (and maybe is still edited) - // thus we simply continue to ask for the next to be checked. - uno::Reference< text::XFlatParagraph > xFlatParaNext( xFPIterator->getNextPara() ); - AddEntry( xFPIterator, xFlatParaNext, aCurDocId, 0, aFPEntryItem.m_bAutomatic ); + SAL_WARN( + "linguistic", + "GrammarCheckingIterator::DequeueAndCheck ignoring UNO" + " exception " << e.Message); } } -- 1.9.3