diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2018-03-23 14:53:44 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2018-03-23 15:46:25 +0100 |
commit | 679a3b9314d56cad05b5ff2a2c2fa3d320f719bb (patch) | |
tree | 97a949dd4f9ba96b461bb34c4ab1aee16a3871d2 /writerfilter | |
parent | 1ed1753be26325edf3660c9b9cbd76dc0e9d36ce (diff) |
msfilter: extract copy&pasted RTF code from sw and writerfilter
Both the hexdump and the OLE1 reader can be shared.
Change-Id: I97d72a8deeb9c79fc8e8c4a73c613213badfa744
Reviewed-on: https://gerrit.libreoffice.org/51783
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 53 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtftokenizer.cxx | 21 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtftokenizer.hxx | 1 |
3 files changed, 7 insertions, 68 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index d779e18bce71..2e8ff1e9ab78 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -19,6 +19,7 @@ #include <unotools/streamwrap.hxx> #include <com/sun/star/drawing/XDrawPageSupplier.hpp> #include <filter/msfilter/util.hxx> +#include <filter/msfilter/rtfutil.hxx> #include <comphelper/string.hxx> #include <vcl/GraphicObject.hxx> #include <tools/globname.hxx> @@ -816,7 +817,7 @@ void RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing::XS if (ch != 0x0d && ch != 0x0a && ch != 0x20) { b = b << 4; - sal_Int8 parsed = RTFTokenizer::asHex(ch); + sal_Int8 parsed = msfilter::rtfutil::AsHex(ch); if (parsed == -1) return; b += parsed; @@ -2342,7 +2343,7 @@ RTFError RTFDocumentImpl::popState() if (ch != 0x0d && ch != 0x0a) { b = b << 4; - sal_Int8 parsed = RTFTokenizer::asHex(ch); + sal_Int8 parsed = msfilter::rtfutil::AsHex(ch); if (parsed == -1) return RTFError::HEX_INVALID; b += parsed; @@ -3319,55 +3320,11 @@ RTFError RTFDocumentImpl::popState() RTFError RTFDocumentImpl::handleEmbeddedObject() { - SvMemoryStream aStream; - int b = 0, count = 2; - - // Feed the destination text to a stream. OString aStr = OUStringToOString(m_aStates.top().pDestinationText->makeStringAndClear(), RTL_TEXTENCODING_ASCII_US); - for (int i = 0; i < aStr.getLength(); ++i) - { - char ch = aStr[i]; - if (ch != 0x0d && ch != 0x0a) - { - b = b << 4; - sal_Int8 parsed = RTFTokenizer::asHex(ch); - if (parsed == -1) - return RTFError::HEX_INVALID; - b += parsed; - count--; - if (!count) - { - aStream.WriteChar(b); - count = 2; - b = 0; - } - } - } - std::unique_ptr<SvStream> pStream(new SvMemoryStream()); - - // Skip ObjectHeader, see [MS-OLEDS] 2.2.4. - if (aStream.Tell()) - { - aStream.Seek(0); - sal_uInt32 nData; - aStream.ReadUInt32(nData); // OLEVersion - aStream.ReadUInt32(nData); // FormatID - aStream.ReadUInt32(nData); // ClassName - aStream.SeekRel(nData); - aStream.ReadUInt32(nData); // TopicName - aStream.SeekRel(nData); - aStream.ReadUInt32(nData); // ItemName - aStream.SeekRel(nData); - aStream.ReadUInt32(nData); // NativeDataSize - - if (nData) - { - pStream->WriteStream(aStream); - pStream->Seek(0); - } - } + if (!msfilter::rtfutil::ExtractOLE2FromObjdata(aStr, *pStream)) + return RTFError::HEX_INVALID; uno::Reference<io::XInputStream> xInputStream( new utl::OSeekableInputStreamWrapper(pStream.release(), /*_bOwner=*/true)); diff --git a/writerfilter/source/rtftok/rtftokenizer.cxx b/writerfilter/source/rtftok/rtftokenizer.cxx index d65bda7c2bb7..8ca3a9dade36 100644 --- a/writerfilter/source/rtftok/rtftokenizer.cxx +++ b/writerfilter/source/rtftok/rtftokenizer.cxx @@ -17,6 +17,7 @@ #include "rtfskipdestination.hxx" #include <com/sun/star/io/BufferSizeExceededException.hpp> #include <osl/diagnose.h> +#include <filter/msfilter/rtfutil.hxx> using namespace com::sun::star; @@ -140,7 +141,7 @@ RTFError RTFTokenizer::resolveParse() { SAL_INFO("writerfilter.rtf", OSL_THIS_FUNC << ": hex internal state"); b = b << 4; - sal_Int8 parsed = asHex(ch); + sal_Int8 parsed = msfilter::rtfutil::AsHex(ch); if (parsed == -1) return RTFError::HEX_INVALID; b += parsed; @@ -167,24 +168,6 @@ RTFError RTFTokenizer::resolveParse() return RTFError::OK; } -int RTFTokenizer::asHex(char ch) -{ - int ret = 0; - if (rtl::isAsciiDigit(static_cast<unsigned char>(ch))) - ret = ch - '0'; - else - { - if (ch >= 'a' && ch <= 'f') - ret = ch - 'a'; - else if (ch >= 'A' && ch <= 'F') - ret = ch - 'A'; - else - return -1; - ret += 10; - } - return ret; -} - void RTFTokenizer::pushGroup() { m_nGroup++; } void RTFTokenizer::popGroup() { m_nGroup--; } diff --git a/writerfilter/source/rtftok/rtftokenizer.hxx b/writerfilter/source/rtftok/rtftokenizer.hxx index 21046f462942..d4847e6ed861 100644 --- a/writerfilter/source/rtftok/rtftokenizer.hxx +++ b/writerfilter/source/rtftok/rtftokenizer.hxx @@ -31,7 +31,6 @@ public: ~RTFTokenizer(); RTFError resolveParse(); - static int asHex(char ch); /// Number of states on the stack. int getGroup() const { return m_nGroup; } /// To be invoked by the pushState() callback to signal when the importer enters a group. |