sw/qa/extras/rtftok/data/fdo39053.rtf |binary sw/qa/extras/rtftok/rtftok.cxx | 21 +++++++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 66 +++++++++++++++++-------- writerfilter/source/rtftok/rtfdocumentimpl.hxx | 4 + writerfilter/source/rtftok/rtftokenizer.cxx | 4 + 5 files changed, 74 insertions(+), 21 deletions(-)
New commits: commit 385017e0f2147d2a49e36d6c44ae76a1e7600668 Author: Miklos Vajna <vmik...@suse.cz> Date: Sun Apr 15 14:39:27 2012 +0200 testcase for fdo#39053 diff --git a/sw/qa/extras/rtftok/data/fdo39053.rtf b/sw/qa/extras/rtftok/data/fdo39053.rtf new file mode 100644 index 0000000..71d2691 Binary files /dev/null and b/sw/qa/extras/rtftok/data/fdo39053.rtf differ diff --git a/sw/qa/extras/rtftok/rtftok.cxx b/sw/qa/extras/rtftok/rtftok.cxx index 9fbffca..2b5146a 100644 --- a/sw/qa/extras/rtftok/rtftok.cxx +++ b/sw/qa/extras/rtftok/rtftok.cxx @@ -82,6 +82,7 @@ public: void testFdo45182(); void testFdo44176(); void testZoom(); + void testFdo39053(); CPPUNIT_TEST_SUITE(RtfModelTest); #if !defined(MACOSX) && !defined(WNT) @@ -105,6 +106,7 @@ public: CPPUNIT_TEST(testFdo45182); CPPUNIT_TEST(testFdo44176); CPPUNIT_TEST(testZoom); + CPPUNIT_TEST(testFdo39053); #endif CPPUNIT_TEST_SUITE_END(); @@ -548,6 +550,25 @@ void RtfModelTest::testZoom() CPPUNIT_ASSERT_EQUAL(sal_Int16(42), nValue); } +void RtfModelTest::testFdo39053() +{ + load("fdo39053.rtf"); + + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY); + int nAsCharacter = 0; + for (int i = 0; i < xDraws->getCount(); ++i) + { + uno::Reference<beans::XPropertySet> xPropertySet(xDraws->getByIndex(i), uno::UNO_QUERY); + text::TextContentAnchorType eValue; + xPropertySet->getPropertyValue("AnchorType") >>= eValue; + if (eValue == text::TextContentAnchorType_AS_CHARACTER) + nAsCharacter++; + } + // The image in binary format was ignored. + CPPUNIT_ASSERT_EQUAL(1, nAsCharacter); +} + CPPUNIT_TEST_SUITE_REGISTRATION(RtfModelTest); CPPUNIT_PLUGIN_IMPLEMENT(); commit 5187174cd4054486100ef29125ee4a36f7e3bee3 Author: Miklos Vajna <vmik...@suse.cz> Date: Sun Apr 15 14:10:49 2012 +0200 fdo#39053 writerfilter: implement RTF_BIN diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index e00458d..54fdac2 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -574,34 +574,42 @@ void RTFDocumentImpl::resolve(Stream & rMapper) int RTFDocumentImpl::resolvePict(bool bInline) { SvMemoryStream aStream; - int b = 0, count = 2; + SvStream *pStream = 0; - // Feed the destination text to a stream. - OString aStr = OUStringToOString(m_aStates.top().aDestinationText.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US); - const char *str = aStr.getStr(); - for (int i = 0; i < aStr.getLength(); ++i) + if (!m_pBinaryData.get()) { - char ch = str[i]; - if (ch != 0x0d && ch != 0x0a) + pStream = &aStream; + int b = 0, count = 2; + + // Feed the destination text to a stream. + OString aStr = OUStringToOString(m_aStates.top().aDestinationText.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US); + const char *str = aStr.getStr(); + for (int i = 0; i < aStr.getLength(); ++i) { - b = b << 4; - sal_Int8 parsed = m_pTokenizer->asHex(ch); - if (parsed == -1) - return ERROR_HEX_INVALID; - b += parsed; - count--; - if (!count) - { - aStream << (char)b; - count = 2; - b = 0; + char ch = str[i]; + if (ch != 0x0d && ch != 0x0a) + { + b = b << 4; + sal_Int8 parsed = m_pTokenizer->asHex(ch); + if (parsed == -1) + return ERROR_HEX_INVALID; + b += parsed; + count--; + if (!count) + { + aStream << (char)b; + count = 2; + b = 0; + } } } } + else + pStream = m_pBinaryData.get(); // Store, and get its URL. - aStream.Seek(0); - uno::Reference<io::XInputStream> xInputStream(new utl::OInputStreamWrapper(&aStream)); + pStream->Seek(0); + uno::Reference<io::XInputStream> xInputStream(new utl::OInputStreamWrapper(pStream)); WMF_EXTERNALHEADER aExtHeader; aExtHeader.mapMode = m_aStates.top().aPicture.eWMetafile; aExtHeader.xExt = m_aStates.top().aPicture.nWidth; @@ -736,6 +744,19 @@ int RTFDocumentImpl::resolvePict(bool bInline) int RTFDocumentImpl::resolveChars(char ch) { + if (m_aStates.top().nInternalState == INTERNAL_BIN) + { + m_pBinaryData.reset(new SvMemoryStream()); + *m_pBinaryData << ch; + for (int i = 0; i < m_aStates.top().nBinaryToRead - 1; ++i) + { + Strm() >> ch; + *m_pBinaryData << ch; + } + m_aStates.top().nInternalState = INTERNAL_NORMAL; + return 0; + } + if (m_aStates.top().nInternalState != INTERNAL_HEX) checkUnicode(false, true); @@ -2758,6 +2779,10 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) case RTF_VIEWSCALE: m_aSettingsTableAttributes->push_back(make_pair(NS_ooxml::LN_CT_Zoom_percent, pIntValue)); break; + case RTF_BIN: + m_aStates.top().nInternalState = INTERNAL_BIN; + m_aStates.top().nBinaryToRead = nParam; + break; default: SAL_INFO("writerfilter", OSL_THIS_FUNC << ": TODO handle value '" << lcl_RtfToString(nKeyword) << "'"); aSkip.setParsed(false); @@ -3545,6 +3570,7 @@ RTFParserState::RTFParserState(RTFDocumentImpl *pDocumentImpl) nCurrentEncoding(0), nUc(1), nCharsToSkip(0), + nBinaryToRead(0), nListLevelNum(0), aListLevelEntries(), aLevelNumbers(), diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 898fb57..81f05c3 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -280,6 +280,8 @@ namespace writerfilter { int nUc; /// Characters to skip, set to nUc by \u. int nCharsToSkip; + /// Characters to read, once in binary mode. + int nBinaryToRead; /// Next list level index to use when parsing list table. int nListLevelNum; @@ -466,6 +468,8 @@ namespace writerfilter { bool m_bObject; /// Contents of the objdata group. boost::shared_ptr<SvStream> m_pObjectData; + /// If the data for a picture is a binary one, it's stored here. + boost::shared_ptr<SvStream> m_pBinaryData; RTFReferenceTable::Entries_t m_aFontTableEntries; int m_nCurrentFontIndex; diff --git a/writerfilter/source/rtftok/rtftokenizer.cxx b/writerfilter/source/rtftok/rtftokenizer.cxx index 125319e..f247317 100644 --- a/writerfilter/source/rtftok/rtftokenizer.cxx +++ b/writerfilter/source/rtftok/rtftokenizer.cxx @@ -95,7 +95,9 @@ int RTFTokenizer::resolveParse() return ERROR_GROUP_UNDER; if (!m_rImport.isEmpty() && m_rImport.getState().nInternalState == INTERNAL_BIN) { - SAL_INFO("writerfilter", OSL_THIS_FUNC << ": TODO, binary internal state"); + ret = m_rImport.resolveChars(ch); + if (ret) + return ret; } else { _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits