summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2018-03-23 14:53:44 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2018-03-23 15:46:25 +0100
commit679a3b9314d56cad05b5ff2a2c2fa3d320f719bb (patch)
tree97a949dd4f9ba96b461bb34c4ab1aee16a3871d2 /writerfilter
parent1ed1753be26325edf3660c9b9cbd76dc0e9d36ce (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.cxx53
-rw-r--r--writerfilter/source/rtftok/rtftokenizer.cxx21
-rw-r--r--writerfilter/source/rtftok/rtftokenizer.hxx1
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.