summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2012-02-13 18:42:56 +0100
committerCaolán McNamara <caolanm@redhat.com>2012-03-12 13:24:47 +0000
commitede11e29bf051e3d78503333b45118cd011d582a (patch)
tree2b2e68aa3ce13ba9a0ad0db90dfe3c5446c9c141
parente73ae4363b55dd544184be1c938f7103f0e64ee3 (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.cxx32
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx6
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