fdo#79761: parse BlockList.xml only once

Change-Id: I3cfc5b66ee73b0e4d07a84c8255c5a006e4fbb25
Reviewed-on: https://gerrit.libreoffice.org/12210
Reviewed-by: Michael Stahl <mstahl@redhat.com>
Tested-by: Michael Stahl <mstahl@redhat.com>
diff --git a/editeng/source/misc/SvXMLAutoCorrectImport.cxx b/editeng/source/misc/SvXMLAutoCorrectImport.cxx
index 8f2f69e..e68362e 100644
--- a/editeng/source/misc/SvXMLAutoCorrectImport.cxx
+++ b/editeng/source/misc/SvXMLAutoCorrectImport.cxx
@@ -56,6 +56,7 @@ SvXMLWordListContext::SvXMLWordListContext(
   SvXMLImportContext ( rImport ),
   rLocalRef(rImport)
{
    rLocalRef.rAutoCorrect.refreshBlockList( rLocalRef.xStorage );
}

com::sun::star::uno::Reference<XFastContextHandler> SAL_CALL SvXMLWordListContext::createFastChildContext(
@@ -94,7 +95,7 @@ SvXMLWordContext::SvXMLWordContext(
    if( !bOnlyTxt )
    {
        const OUString sLongSave( sRight );
        if( !rLocalRef.rAutoCorrect.GetLongText( rLocalRef.xStorage, sWrong, sRight ) &&
        if( !rLocalRef.rAutoCorrect.GetLongText( sWrong, sRight ) &&
            !sLongSave.isEmpty() )
        {
            sRight = sLongSave;
diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
index 9b840f3..6b235de 100644
--- a/editeng/source/misc/svxacorr.cxx
+++ b/editeng/source/misc/svxacorr.cxx
@@ -1627,12 +1627,15 @@ bool SvxAutoCorrect::MakeCombinedChanges( std::vector<SvxAutocorrWord>& aNewEntr

//  - return the replacement text (only for SWG-Format, all other
//    can be taken from the word list!)
bool SvxAutoCorrect::GetLongText( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >&,
                                  const OUString&, OUString& )
bool SvxAutoCorrect::GetLongText( const OUString&, OUString& )
{
    return false;
}

void SvxAutoCorrect::refreshBlockList( const uno::Reference< embed::XStorage >& )
{
}

// Text with attribution (only the SWG - SWG format!)
bool SvxAutoCorrect::PutText( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >&,
                              const OUString&, const OUString&, SfxObjectShell&, OUString& )
diff --git a/include/editeng/svxacorr.hxx b/include/editeng/svxacorr.hxx
index 8ad8564..f227ff3 100644
--- a/include/editeng/svxacorr.hxx
+++ b/include/editeng/svxacorr.hxx
@@ -275,8 +275,9 @@ public:

    sal_Unicode GetQuote( sal_Unicode cInsChar, bool bSttQuote,
                            LanguageType eLang ) const;
    virtual bool GetLongText( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rStg,
                              const OUString& rShort, OUString& rLong );
    virtual bool GetLongText( const OUString& rShort, OUString& rLong );

    virtual void refreshBlockList( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rStg);

    TYPEINFO();

diff --git a/sw/inc/swacorr.hxx b/sw/inc/swacorr.hxx
index 5bb3c93..33598c6 100644
--- a/sw/inc/swacorr.hxx
+++ b/sw/inc/swacorr.hxx
@@ -24,15 +24,20 @@
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/embed/XStorage.hpp>

#include "SwXMLTextBlocks.hxx"

class SwAutoCorrect : public SvxAutoCorrect
{
    using  SvxAutoCorrect::PutText;

    std::unique_ptr<SwXMLTextBlocks> m_pTextBlocks;

protected:
    // Return replacement text (only for SWG-format, all others can be obtained from wordlist!).
    // rShort is stream-name - encrypted!
    virtual bool GetLongText( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >&,
                              const OUString& rShort, OUString& rLong ) SAL_OVERRIDE;
    virtual bool GetLongText( const OUString& rShort, OUString& rLong ) SAL_OVERRIDE;

    virtual void refreshBlockList( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& ) SAL_OVERRIDE;

    // Text with attributes (only SWG-format!).
    // rShort is stream-name - encrypted!
diff --git a/sw/source/core/sw3io/swacorr.cxx b/sw/source/core/sw3io/swacorr.cxx
index 8472942..0a08b01 100644
--- a/sw/source/core/sw3io/swacorr.cxx
+++ b/sw/source/core/sw3io/swacorr.cxx
@@ -37,20 +37,24 @@ TYPEINIT1( SwAutoCorrect, SvxAutoCorrect );
 *
 * @param rShort - the stream name (encrypted)
 */
bool SwAutoCorrect::GetLongText( const uno::Reference < embed::XStorage >& rStg,
                                 const OUString& rShort, OUString& rLong )
bool SwAutoCorrect::GetLongText( const OUString& rShort, OUString& rLong )
{
    sal_uLong nRet = 0;
    assert( m_pTextBlocks );
    nRet = m_pTextBlocks->GetText( rShort, rLong );
    return !IsError( nRet ) && !rLong.isEmpty();
}

void SwAutoCorrect::refreshBlockList( const uno::Reference< embed::XStorage >& rStg )
{
    if (rStg.is())
    {
        // mba: relative URLs don't make sense here
        SwXMLTextBlocks aBlk( rStg, OUString() );
        nRet = aBlk.GetText( rShort, rLong );
        m_pTextBlocks.reset( new SwXMLTextBlocks( rStg, OUString() ) );
    }
    else {
       OSL_ENSURE( rStg.is(), "Someone passed SwAutoCorrect::GetLongText a dud storage!");
       OSL_ENSURE( rStg.is(), "Someone passed SwAutoCorrect::refreshBlockList a dud storage!");
    }
    return !IsError( nRet ) && !rLong.isEmpty();
}

    //  - Text mit Attributierung (kann nur der SWG - SWG-Format!)