diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2012-02-13 18:42:56 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2012-03-12 13:24:47 +0000 |
commit | ede11e29bf051e3d78503333b45118cd011d582a (patch) | |
tree | 2b2e68aa3ce13ba9a0ad0db90dfe3c5446c9c141 | |
parent | e73ae4363b55dd544184be1c938f7103f0e64ee3 (diff) |
fdo#45543 fix RTF import of ms932-encoded characters
(cherry picked from commits d7baacd81bbcfaa35b7fbf9981fa3fa7c9fb1cb4,
0915f1b3d77afa694a2ca692aec307846827da99 and
00859026749e005759ce4e7115b746b064cd902b)
Signed-off-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 32 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.hxx | 6 |
2 files changed, 30 insertions, 8 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 737350ba82ec..824615da20d7 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -305,7 +305,8 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x m_bWasInFrame(false), m_bIsInFrame(false), m_bHasPage(false), - m_aUnicodeBuffer() + m_aUnicodeBuffer(), + m_aHexBuffer() { OSL_ASSERT(xInputStream.is()); m_pInStream.reset(utl::UcbStreamHelper::CreateStream(xInputStream, sal_True)); @@ -738,9 +739,13 @@ int RTFDocumentImpl::resolvePict(bool bInline) int RTFDocumentImpl::resolveChars(char ch) { + if (m_aStates.top().nInternalState != INTERNAL_HEX) + checkUnicode(false, true); + OStringBuffer aBuf; bool bUnicodeChecked = false; + bool bSkipped = false; while(!Strm().IsEof() && ch != '{' && ch != '}' && ch != '\\') { if (ch != 0x0d && ch != 0x0a) @@ -749,13 +754,16 @@ int RTFDocumentImpl::resolveChars(char ch) { if (!bUnicodeChecked) { - checkUnicode(); + checkUnicode(true, false); bUnicodeChecked = true; } aBuf.append(ch); } else + { + bSkipped = true; m_aStates.top().nCharsToSkip--; + } } // read a single char if we're in hex mode if (m_aStates.top().nInternalState == INTERNAL_HEX) @@ -764,6 +772,14 @@ int RTFDocumentImpl::resolveChars(char ch) } if (m_aStates.top().nInternalState != INTERNAL_HEX && !Strm().IsEof()) Strm().SeekRel(-1); + + if (m_aStates.top().nInternalState == INTERNAL_HEX && m_aStates.top().nDestinationState != DESTINATION_LEVELNUMBERS) + { + if (!bSkipped) + m_aHexBuffer.append(ch); + return 0; + } + if (m_aStates.top().nDestinationState == DESTINATION_SKIP) return 0; OString aStr = aBuf.makeStringAndClear(); @@ -2031,8 +2047,7 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) { - if (nKeyword != RTF_U) - checkUnicode(); + checkUnicode(nKeyword != RTF_U, true); RTFSkipDestination aSkip(*this); int nSprm = 0; RTFValue::Pointer_t pIntValue(new RTFValue(nParam)); @@ -3370,13 +3385,18 @@ void RTFDocumentImpl::setSkipUnknown(bool bSkipUnknown) m_bSkipUnknown = bSkipUnknown; } -void RTFDocumentImpl::checkUnicode() +void RTFDocumentImpl::checkUnicode(bool bUnicode, bool bHex) { - if (m_aUnicodeBuffer.getLength() > 0) + if (bUnicode && m_aUnicodeBuffer.getLength() > 0) { OUString aString = m_aUnicodeBuffer.makeStringAndClear(); text(aString); } + if (bHex && m_aHexBuffer.getLength() > 0) + { + OUString aString = OStringToOUString(m_aHexBuffer.makeStringAndClear(), m_aStates.top().nCurrentEncoding); + text(aString); + } } RTFParserState::RTFParserState() diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 713fd7d292ea..3644375adcb6 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -364,8 +364,8 @@ namespace writerfilter { void replayBuffer(RTFBuffer_t& rBuffer); /// If we got tokens indicating we're in a frame. bool inFrame(); - /// If we have some unicode characters to send. - void checkUnicode(); + /// If we have some unicode or hex characters to send. + void checkUnicode(bool bUnicode = true, bool bHex = true); uno::Reference<uno::XComponentContext> const& m_xContext; uno::Reference<io::XInputStream> const& m_xInputStream; @@ -454,6 +454,8 @@ namespace writerfilter { bool m_bHasPage; // Unicode characters are collected here so we don't have to send them one by one. rtl::OUStringBuffer m_aUnicodeBuffer; + /// Same for hex characters. + rtl::OStringBuffer m_aHexBuffer; }; } // namespace rtftok } // namespace writerfilter |