[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - editeng/source svtools/source xmloff/source

Mark Hung marklh9 at gmail.com
Mon Nov 2 03:08:57 PST 2015


 editeng/source/rtf/svxrtf.cxx    |    8 +++++++-
 svtools/source/svrtf/parrtf.cxx  |   21 +++++++++++++++++++--
 xmloff/source/style/styleexp.cxx |    4 ++++
 3 files changed, 30 insertions(+), 3 deletions(-)

New commits:
commit 52f3eb47aa42bd1a2a61088706cd3c729e274fc0
Author: Mark Hung <marklh9 at gmail.com>
Date:   Sun Aug 30 16:08:20 2015 +0800

    Fix tdf#93438 Impress generate abnormal style when copy-pasting
    
    from Writer with Chinese UI. When user configure UI language as
    Chinese, style names are also translated. However when Copy-pasting
    from Writer to Impress ( select RTF fromat with paste-special),
    Chinese (unicode) style names are borken into multiparts, where
    some of them are empty string. Neither deleting the abnormal
    style nor saving the file can be achieved. The only remedy is to
    remove style with emtpy name with macro. With this patch:
    1) Catch NoSuchElementException and ignores it, so
       user still has chance saving file.
    2) Make sure style has valid number before inserting it.
    3) Prevent text breaking into multiple tokens by handling  ucN in
     ScanText().
    
    Change-Id: I417f70b81c23ac63c175cc13c548068873d13a38
    Reviewed-on: https://gerrit.libreoffice.org/18148
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Norbert Thiebaud <nthiebaud at gmail.com>
    Reviewed-on: https://gerrit.libreoffice.org/19685

diff --git a/editeng/source/rtf/svxrtf.cxx b/editeng/source/rtf/svxrtf.cxx
index 56ef736..ec633c8 100644
--- a/editeng/source/rtf/svxrtf.cxx
+++ b/editeng/source/rtf/svxrtf.cxx
@@ -300,6 +300,7 @@ void SvxRTFParser::ReadStyleTable()
 {
     int nToken, bSaveChkStyleAttr = bChkStyleAttr ? 1 : 0;
     sal_uInt16 nStyleNo = 0;
+    bool bHasStyleNo = false;
     int _nOpenBrakets = 1;      // the first was already detected earlier!!
     SvxRTFStyleType* pStyle = new SvxRTFStyleType( *pAttrPool, &aWhichMap[0] );
     pStyle->aAttrSet.Put( GetRTFDefaults() );
@@ -340,12 +341,16 @@ void SvxRTFParser::ReadStyleTable()
         case RTF_SNEXT:     pStyle->nNext = sal_uInt16(nTokenValue);    break;
         case RTF_OUTLINELEVEL:
         case RTF_SOUTLVL:   pStyle->nOutlineNo = sal_uInt8(nTokenValue);    break;
-        case RTF_S:         nStyleNo = (short)nTokenValue;          break;
+        case RTF_S:         nStyleNo = (short)nTokenValue;
+                            bHasStyleNo = true;
+                            break;
         case RTF_CS:        nStyleNo = (short)nTokenValue;
+                            bHasStyleNo = true;
                             pStyle->bIsCharFmt = true;
                             break;
 
         case RTF_TEXTTOKEN:
+            if (bHasStyleNo)
             {
                 pStyle->sName = DelCharAtEnd( aToken, ';' );
 
@@ -358,6 +363,7 @@ void SvxRTFParser::ReadStyleTable()
                 pStyle = new SvxRTFStyleType( *pAttrPool, &aWhichMap[0] );
                 pStyle->aAttrSet.Put( GetRTFDefaults() );
                 nStyleNo = 0;
+                bHasStyleNo = false;
             }
             break;
         default:
diff --git a/svtools/source/svrtf/parrtf.cxx b/svtools/source/svrtf/parrtf.cxx
index fc98b87..e7be520 100644
--- a/svtools/source/svrtf/parrtf.cxx
+++ b/svtools/source/svrtf/parrtf.cxx
@@ -431,6 +431,24 @@ void SvRTFParser::ScanText( const sal_Unicode cBreak )
                             aToken = sSave;
                             bRTF_InTextRead = false;
                         }
+                        else if ( 'c' == nNextCh )
+                        {
+                            // Prevent text breaking into multiple tokens.
+                            rInput.SeekRel( 2 );
+                            nNextCh = GetNextChar();
+                            if (RTF_ISDIGIT( nNextCh ))
+                            {
+                                sal_uInt8 nNewOverread = 0 ;
+                                do {
+                                    nNewOverread *= 10;
+                                    nNewOverread += nNextCh - '0';
+                                    nNextCh = GetNextChar();
+                                } while ( RTF_ISDIGIT( nNextCh ) );
+                                nUCharOverread = nNewOverread;
+                                aParserStates.top().nUCharOverread = nNewOverread;
+                            }
+                            bNextCh = 0x20 == nNextCh;
+                        }
                         else
                         {
                             nNextCh = '\\';
@@ -448,8 +466,7 @@ void SvRTFParser::ScanText( const sal_Unicode cBreak )
             }
             break;
 
-        case sal_Unicode(EOF):
-                eState = SVPAR_ERROR;
+        case sal_Unicode(EOF): eState = SVPAR_ERROR;
                 // continue
         case '{':
         case '}':
diff --git a/xmloff/source/style/styleexp.cxx b/xmloff/source/style/styleexp.cxx
index 0ab12cc..8ca89b6 100644
--- a/xmloff/source/style/styleexp.cxx
+++ b/xmloff/source/style/styleexp.cxx
@@ -419,6 +419,10 @@ void XMLStyleExport::exportStyleFamily(
             // not export them here and remain silent.
             continue;
         }
+        catch(css::container::NoSuchElementException&)
+        {
+            continue;
+        }
 
         assert(xStyle.is());
         if (!bUsed || xStyle->isInUse())


More information about the Libreoffice-commits mailing list