diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2015-01-22 12:47:29 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2015-01-22 12:53:11 +0100 |
commit | b1dbc511eeaf88e3b4b5a8a2dce129d251d2dcb6 (patch) | |
tree | 9799b8c0eb43e5b9621818eb76e434c957ce83bd /linguistic | |
parent | e25b4bd9f83753211e868882547d96a4040d572f (diff) |
rhbz#1184582: At least catch and log UNO exceptions in grammar checking thread
Change-Id: I87744f86d1413973709a46a58ebc03a39bce842c
Diffstat (limited to 'linguistic')
-rw-r--r-- | linguistic/source/gciterator.cxx | 110 |
1 files changed, 60 insertions, 50 deletions
diff --git a/linguistic/source/gciterator.cxx b/linguistic/source/gciterator.cxx index bc31490060de..1694d74a6744 100644 --- a/linguistic/source/gciterator.cxx +++ b/linguistic/source/gciterator.cxx @@ -544,70 +544,80 @@ void GrammarCheckingIterator::DequeueAndCheck() if (xFlatPara.is() && xFPIterator.is()) { - OUString aCurTxt( xFlatPara->getText() ); - lang::Locale aCurLocale = lcl_GetPrimaryLanguageOfSentence( xFlatPara, aFPEntryItem.m_nStartIndex ); - - const bool 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?" ); + const bool 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<beans::PropertyValue> const aProps( + linguistic2::ProofreadingResult aRes; + + uno::Reference< linguistic2::XProofreader > xGC( GetGrammarChecker( aCurLocale ), uno::UNO_QUERY ); + if (xGC.is()) + { + aGuard.clear(); + uno::Sequence<beans::PropertyValue> 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); } } |