[Libreoffice-commits] .: 4 commits - sal/rtl solenv/gbuild svtools/source sw/inc sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Sep 26 03:58:55 PDT 2012


 sal/rtl/source/uri.cxx                  |   34 ++++++++++++++------------------
 solenv/gbuild/platform/WNT_INTEL_MSC.mk |    1 
 svtools/source/misc/transfer.cxx        |    2 -
 sw/inc/printdata.hxx                    |    2 -
 sw/inc/unotxdoc.hxx                     |    5 ++--
 sw/source/core/view/printdata.cxx       |    5 ++++
 sw/source/ui/uno/unotxdoc.cxx           |   26 ++++++++++++++++--------
 7 files changed, 44 insertions(+), 31 deletions(-)

New commits:
commit d53e12c7a9c2d0a3b487303673c1fafd09f6593c
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Sep 26 12:43:29 2012 +0200

    rhbz#827695: sw: prevent crashes after incomplete print:
    
    If the last page is not printed for whatever reason, then
    SwXTextDocument's destructor will delete a SwViewOptionAdjust_Impl,
    which accesses the document's ViewShell, which has already been
    deleted at that point.  Add a horrible kludge to not crash for now.
    
    Change-Id: I67fe37970d60782030b84f2badddd1e66ef3f9c6

diff --git a/sw/inc/printdata.hxx b/sw/inc/printdata.hxx
index 00e7fe5..0f58d30 100644
--- a/sw/inc/printdata.hxx
+++ b/sw/inc/printdata.hxx
@@ -42,7 +42,6 @@
 
 class SwDoc;
 class SwDocShell;
-class ViewShell;
 class _SetGetExpFlds;
 class SwViewOption;
 class OutputDevice;
@@ -277,6 +276,7 @@ public:
     void ViewOptionAdjustStart( ViewShell &rSh, const SwViewOption &rViewOptions);
     void ViewOptionAdjust( SwPrintData const* const pPrtOptions );
     void ViewOptionAdjustStop();
+    void ViewOptionAdjustCrashPreventionKludge();
 
     bool HasSwPrtOptions() const    { return m_pPrtOptions != 0; }
     SwPrintData const*  GetSwPrtOptions() const { return m_pPrtOptions.get(); }
diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx
index 443aa76..3182bd2 100644
--- a/sw/inc/unotxdoc.hxx
+++ b/sw/inc/unotxdoc.hxx
@@ -579,7 +579,7 @@ public:
   -----------------------------------------------------------------------*/
 class SwViewOptionAdjust_Impl
 {
-    ViewShell &    m_rShell;
+    ViewShell *     m_pShell;
     SwViewOption    m_aOldViewOptions;
 
 public:
@@ -587,7 +587,8 @@ public:
     ~SwViewOptionAdjust_Impl();
     void AdjustViewOptions( SwPrintData const* const pPrtOptions );
     bool checkShell( const ViewShell& rCompare ) const
-    { return &rCompare == &m_rShell; }
+    { return &rCompare == m_pShell; }
+    void DontTouchThatViewShellItSmellsFunny() { m_pShell = 0; }
 };
 
 
diff --git a/sw/source/core/view/printdata.cxx b/sw/source/core/view/printdata.cxx
index 4e6d37f..9988855 100644
--- a/sw/source/core/view/printdata.cxx
+++ b/sw/source/core/view/printdata.cxx
@@ -131,6 +131,11 @@ void SwRenderData::ViewOptionAdjustStop()
     m_pViewOptionAdjust.reset();
 }
 
+void SwRenderData::ViewOptionAdjustCrashPreventionKludge()
+{
+    m_pViewOptionAdjust->DontTouchThatViewShellItSmellsFunny();
+}
+
 
 void SwRenderData::MakeSwPrtOptions(
     SwDocShell const*const pDocShell,
diff --git a/sw/source/ui/uno/unotxdoc.cxx b/sw/source/ui/uno/unotxdoc.cxx
index 8bee384..ef09ecf 100644
--- a/sw/source/ui/uno/unotxdoc.cxx
+++ b/sw/source/ui/uno/unotxdoc.cxx
@@ -400,6 +400,13 @@ SwXTextDocument::~SwXTextDocument()
         xNumFmtAgg = 0;
     }
     delete m_pPrintUIOptions;
+    if (m_pRenderData && m_pRenderData->IsViewOptionAdjust())
+    {   // rhbz#827695: this can happen if the last page is not printed
+        // the ViewShell has been deleted already by SwView::~SwView
+        // FIXME: replace this awful implementation of XRenderable with
+        // something less insane that has its own view
+        m_pRenderData->ViewOptionAdjustCrashPreventionKludge();
+    }
     delete m_pRenderData;
 }
 
@@ -3852,14 +3859,17 @@ void SwXDocumentPropertyHelper::onChange()
 
 SwViewOptionAdjust_Impl::SwViewOptionAdjust_Impl(
             ViewShell& rSh, const SwViewOption &rViewOptions)
-    : m_rShell( rSh )
+    : m_pShell(&rSh)
     , m_aOldViewOptions( rViewOptions )
 {
 }
 
 SwViewOptionAdjust_Impl::~SwViewOptionAdjust_Impl()
 {
-    m_rShell.ApplyViewOptions( m_aOldViewOptions );
+    if (m_pShell)
+    {
+        m_pShell->ApplyViewOptions( m_aOldViewOptions );
+    }
 }
 
 void
@@ -3867,14 +3877,14 @@ SwViewOptionAdjust_Impl::AdjustViewOptions(SwPrintData const*const pPrtOptions)
 {
     // to avoid unnecessary reformatting the view options related to the content
     // below should only change if necessary, that is if respective content is present
-    const bool bContainsHiddenChars         = m_rShell.GetDoc()->ContainsHiddenChars();
-    const SwFieldType* pFldType = m_rShell.GetDoc()->GetSysFldType( RES_HIDDENTXTFLD );
+    const bool bContainsHiddenChars         = m_pShell->GetDoc()->ContainsHiddenChars();
+    const SwFieldType* pFldType = m_pShell->GetDoc()->GetSysFldType( RES_HIDDENTXTFLD );
     const bool bContainsHiddenFields        = pFldType && pFldType->GetDepends();
-    pFldType = m_rShell.GetDoc()->GetSysFldType( RES_HIDDENPARAFLD );
+    pFldType = m_pShell->GetDoc()->GetSysFldType( RES_HIDDENPARAFLD );
     const bool bContainsHiddenParagraphs    = pFldType && pFldType->GetDepends();
-    pFldType = m_rShell.GetDoc()->GetSysFldType( RES_JUMPEDITFLD );
+    pFldType = m_pShell->GetDoc()->GetSysFldType( RES_JUMPEDITFLD );
     const bool bContainsPlaceHolders        = pFldType && pFldType->GetDepends();
-    const bool bContainsFields              = m_rShell.IsAnyFieldInDoc();
+    const bool bContainsFields              = m_pShell->IsAnyFieldInDoc();
 
     SwViewOption aRenderViewOptions( m_aOldViewOptions );
 
@@ -3914,7 +3924,7 @@ SwViewOptionAdjust_Impl::AdjustViewOptions(SwPrintData const*const pPrtOptions)
     if (m_aOldViewOptions != aRenderViewOptions)  // check if reformatting is necessary
     {
         aRenderViewOptions.SetPrinting( pPrtOptions != NULL );
-        m_rShell.ApplyViewOptions( aRenderViewOptions );
+        m_pShell->ApplyViewOptions( aRenderViewOptions );
     }
 }
 
commit 0843533459302d9d9fe962f79dc5b040c3907ebc
Author: Michael Stahl <mstahl at redhat.com>
Date:   Wed Sep 26 12:37:26 2012 +0200

    sal: uri.cxx: deploy some asserts
    
    Change-Id: I1d755086295f5a8cd7acf56204402b95fe228d2d

diff --git a/sal/rtl/source/uri.cxx b/sal/rtl/source/uri.cxx
index 3945e04..34da06f 100644
--- a/sal/rtl/source/uri.cxx
+++ b/sal/rtl/source/uri.cxx
@@ -201,15 +201,13 @@ sal_uInt32 readUcs4(sal_Unicode const ** pBegin, sal_Unicode const * pEnd,
                     &nInfo, &nConverted);
                 if (nInfo == 0)
                 {
-                    OSL_ASSERT(
-                        nConverted
+                    assert( nConverted
                         == sal::static_int_cast< sal_uInt32 >(
                             aBuf.getLength()));
                     rtl_destroyTextToUnicodeConverter(aConverter);
                     *pBegin = p;
                     *pType = EscapeChar;
-                    OSL_ASSERT(
-                        nDstSize == 1
+                    assert( nDstSize == 1
                         || (nDstSize == 2 && isHighSurrogate(aDst[0])
                             && isLowSurrogate(aDst[1])));
                     return nDstSize == 1
@@ -230,7 +228,7 @@ sal_uInt32 readUcs4(sal_Unicode const ** pBegin, sal_Unicode const * pEnd,
                 }
                 else
                 {
-                    OSL_ASSERT(
+                    assert(
                         (nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL)
                         == 0);
                     break;
@@ -252,7 +250,7 @@ sal_uInt32 readUcs4(sal_Unicode const ** pBegin, sal_Unicode const * pEnd,
 
 void writeUcs4(rtl_uString ** pBuffer, sal_Int32 * pCapacity, sal_uInt32 nUtf32)
 {
-    OSL_ENSURE(nUtf32 <= 0x10FFFF, "bad UTF-32 char");
+    assert(nUtf32 <= 0x10FFFF); // bad UTF-32 char
     if (nUtf32 <= 0xFFFF) {
         writeUnicode(
             pBuffer, pCapacity, static_cast< sal_Unicode >(nUtf32));
@@ -270,7 +268,7 @@ void writeUcs4(rtl_uString ** pBuffer, sal_Int32 * pCapacity, sal_uInt32 nUtf32)
 void writeEscapeOctet(rtl_uString ** pBuffer, sal_Int32 * pCapacity,
                       sal_uInt32 nOctet)
 {
-    OSL_ENSURE(nOctet <= 0xFF, "bad octet");
+    assert(nOctet <= 0xFF); // bad octet
 
     static sal_Unicode const aHex[16]
         = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
@@ -284,7 +282,7 @@ void writeEscapeOctet(rtl_uString ** pBuffer, sal_Int32 * pCapacity,
 bool writeEscapeChar(rtl_uString ** pBuffer, sal_Int32 * pCapacity,
                      sal_uInt32 nUtf32, rtl_TextEncoding eCharset, bool bStrict)
 {
-    OSL_ENSURE(nUtf32 <= 0x10FFFF, "bad UTF-32 char");
+    assert(nUtf32 <= 0x10FFFF); // bad UTF-32 char
     if (eCharset == RTL_TEXTENCODING_UTF8) {
         if (nUtf32 < 0x80)
             writeEscapeOctet(pBuffer, pCapacity, nUtf32);
@@ -333,10 +331,10 @@ bool writeEscapeChar(rtl_uString ** pBuffer, sal_Int32 * pCapacity,
             | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR
             | RTL_UNICODETOTEXT_FLAGS_FLUSH,
             &nInfo, &nConverted);
-        OSL_ASSERT((nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL) == 0);
+        assert((nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL) == 0);
         rtl_destroyUnicodeToTextConverter(aConverter);
         if (nInfo == 0) {
-            OSL_ENSURE(nConverted == nSrcSize, "bad rtl_convertUnicodeToText");
+            assert(nConverted == nSrcSize); // bad rtl_convertUnicodeToText
             for (sal_Size i = 0; i < nDstSize; ++i)
                 writeEscapeOctet(pBuffer, pCapacity,
                                  static_cast< unsigned char >(aDst[i]));
@@ -366,7 +364,7 @@ struct Component
 
 inline sal_Int32 Component::getLength() const
 {
-    OSL_ENSURE(isPresent(), "taking length of non-present component");
+    assert(isPresent()); // taking length of non-present component
     return static_cast< sal_Int32 >(pEnd - pBegin);
 }
 
@@ -430,7 +428,7 @@ void parseUriRef(rtl_uString const * pUriRef, Components * pComponents)
 
     if (pPos != pEnd)
     {
-        OSL_ASSERT(*pPos == '#');
+        assert(*pPos == '#');
         pComponents->aFragment.pBegin = pPos;
         pComponents->aFragment.pEnd = pEnd;
     }
@@ -438,8 +436,8 @@ void parseUriRef(rtl_uString const * pUriRef, Components * pComponents)
 
 rtl::OUString joinPaths(Component const & rBasePath, Component const & rRelPath)
 {
-    OSL_ASSERT(rBasePath.isPresent() && *rBasePath.pBegin == '/');
-    OSL_ASSERT(rRelPath.isPresent());
+    assert(rBasePath.isPresent() && *rBasePath.pBegin == '/');
+    assert(rRelPath.isPresent());
 
     // The invariant of aBuffer is that it always starts and ends with a slash
     // (until probably right at the end of the algorithm, when the last segment
@@ -591,11 +589,10 @@ sal_Bool const * SAL_CALL rtl_getUriCharClass(rtl_UriCharClass eCharClass)
          0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/
          1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0  /*pqrstuvwxyz{|}~ */
        }};
-    OSL_ENSURE(
+    assert(
         (eCharClass >= 0
          && (sal::static_int_cast< std::size_t >(eCharClass)
-             < SAL_N_ELEMENTS(aCharClass))),
-        "bad eCharClass");
+             < SAL_N_ELEMENTS(aCharClass)))); // bad eCharClass
     return aCharClass[eCharClass];
 }
 
@@ -604,8 +601,7 @@ void SAL_CALL rtl_uriEncode(rtl_uString * pText, sal_Bool const * pCharClass,
                             rtl_TextEncoding eCharset, rtl_uString ** pResult)
     SAL_THROW_EXTERN_C()
 {
-    OSL_ENSURE(!pCharClass[0x25], "bad pCharClass");
-        // make sure the percent sign is encoded...
+    assert(!pCharClass[0x25]); // make sure the percent sign is encoded...
 
     sal_Unicode const * p = pText->buffer;
     sal_Unicode const * pEnd = p + pText->length;
commit 8385aa5f73e4f6dda8a234240d03420e9a7da69e
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Sep 25 21:19:16 2012 +0200

    TransferableHelper: fix annoying assertion "bad pCharClass"
    
    The % must be URI encoded, not acceptable.
    
    Change-Id: I1274170275d1a1432fb2f933cbd3c6ee8c35d436

diff --git a/svtools/source/misc/transfer.cxx b/svtools/source/misc/transfer.cxx
index 79a6412..8c41222 100644
--- a/svtools/source/misc/transfer.cxx
+++ b/svtools/source/misc/transfer.cxx
@@ -181,7 +181,7 @@ static ::rtl::OUString ImplGetParameterString( const TransferableObjectDescripto
             pToAccept[nBInd] = sal_False;
 
         const char aQuotedParamChars[] =
-            "()<>@,;:\\\"/[]?=!#$%&'*+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~. ";
+            "()<>@,;:\\\"/[]?=!#$&'*+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~. ";
 
         for ( sal_Int32 nInd = 0; nInd < RTL_CONSTASCII_LENGTH(aQuotedParamChars); ++nInd )
         {
commit f0f2efaea61e674ea62430d6cda65882c90104a1
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Sep 25 14:46:03 2012 +0200

    gbuild: disable MSVC warning C4628 for C++:
    
    the useless "digraphs not supported with -Ze. Character sequence '<:'
    not interpreted as alternate token for '['" occurs a lot with templates.
    
    Change-Id: I1f7ddb7545732a5e92d1fc78a16222540cca5bb9

diff --git a/solenv/gbuild/platform/WNT_INTEL_MSC.mk b/solenv/gbuild/platform/WNT_INTEL_MSC.mk
index 33ee98d..f23c478 100644
--- a/solenv/gbuild/platform/WNT_INTEL_MSC.mk
+++ b/solenv/gbuild/platform/WNT_INTEL_MSC.mk
@@ -167,6 +167,7 @@ gb_CXXFLAGS := \
 	-wd4619 \
 	-wd4625 \
 	-wd4626 \
+	-wd4628 \
 	-wd4640 \
 	-wd4668 \
 	-wd4675 \


More information about the Libreoffice-commits mailing list