summaryrefslogtreecommitdiff
path: root/writerfilter/source/rtftok/rtfdocumentimpl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/rtftok/rtfdocumentimpl.cxx')
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx27
1 files changed, 21 insertions, 6 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index bd02037edcff..4c3994765d0a 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -297,7 +297,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));
@@ -727,6 +728,9 @@ 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;
@@ -738,7 +742,7 @@ int RTFDocumentImpl::resolveChars(char ch)
{
if (!bUnicodeChecked)
{
- checkUnicode();
+ checkUnicode(true, false);
bUnicodeChecked = true;
}
aBuf.append(ch);
@@ -753,6 +757,13 @@ 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_aHexBuffer.append(ch);
+ return 0;
+ }
+
if (m_aStates.top().nDestinationState == DESTINATION_SKIP)
return 0;
OString aStr = aBuf.makeStringAndClear();
@@ -1980,8 +1991,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));
@@ -3290,13 +3300,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()