summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2015-08-30 16:08:20 +0800
committerNorbert Thiebaud <nthiebaud@gmail.com>2015-08-31 01:31:44 +0000
commit0955bfed86e55f823fb9686f52dbffc36558b5d5 (patch)
treee8be2990faee9d11bdcb19ee30f654abe2da7220
parent30211d1edf2487816fa6bcc0187e617777651f60 (diff)
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@libreoffice.org> Reviewed-by: Norbert Thiebaud <nthiebaud@gmail.com>
-rw-r--r--editeng/source/rtf/svxrtf.cxx8
-rw-r--r--svtools/source/svrtf/parrtf.cxx21
-rw-r--r--xmloff/source/style/styleexp.cxx4
3 files changed, 30 insertions, 3 deletions
diff --git a/editeng/source/rtf/svxrtf.cxx b/editeng/source/rtf/svxrtf.cxx
index a027bf60c06b..0d10e23e4251 100644
--- a/editeng/source/rtf/svxrtf.cxx
+++ b/editeng/source/rtf/svxrtf.cxx
@@ -299,6 +299,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!!
::std::unique_ptr<SvxRTFStyleType> pStyle(
new SvxRTFStyleType( *pAttrPool, &aWhichMap[0] ));
@@ -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.reset(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 4254a71c246d..7216a4f3e710 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 0ab12cce8c5e..8ca89b6f6507 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())