summaryrefslogtreecommitdiffstats
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-07-05 17:38:12 +0200
committerMiklos Vajna <vmiklos@suse.cz>2013-07-05 18:11:07 +0200
commit05f0859afba779ce28d24e3195d8266d616259d1 (patch)
treee9ce2928912360e1d77ec9a1cbeb0f8e82f996eb /writerfilter
parentRTFTokenizer: remember start pos of current group (diff)
downloadcore-05f0859afba779ce28d24e3195d8266d616259d1.tar.gz
core-05f0859afba779ce28d24e3195d8266d616259d1.zip
writerfilter: add RTFLookahead to be able to look ahead during import
Change-Id: I1da765373c352c8a2aa486fe6210b16bf492728c
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/Library_writerfilter.mk1
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx9
-rw-r--r--writerfilter/source/rtftok/rtflookahead.cxx130
-rw-r--r--writerfilter/source/rtftok/rtflookahead.hxx56
4 files changed, 194 insertions, 2 deletions
diff --git a/writerfilter/Library_writerfilter.mk b/writerfilter/Library_writerfilter.mk
index 19935907c18a..4fab4aa743c8 100644
--- a/writerfilter/Library_writerfilter.mk
+++ b/writerfilter/Library_writerfilter.mk
@@ -79,6 +79,7 @@ $(eval $(call gb_Library_add_exception_objects,writerfilter,\
writerfilter/source/rtftok/rtfcontrolwords \
writerfilter/source/rtftok/rtfdocumentfactory \
writerfilter/source/rtftok/rtfdocumentimpl \
+ writerfilter/source/rtftok/rtflookahead \
writerfilter/source/rtftok/rtfreferenceproperties \
writerfilter/source/rtftok/rtfreferencetable \
writerfilter/source/rtftok/rtfsdrimport \
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 56d8a1ba3345..73d06c43a941 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -49,6 +49,7 @@
#include <rtfsdrimport.hxx>
#include <rtftokenizer.hxx>
+#include <rtflookahead.hxx>
#include <rtfcharsets.hxx>
#include <rtfreferenceproperties.hxx>
#include <rtfskipdestination.hxx>
@@ -1679,8 +1680,12 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
m_aStates.top().bInBackground = true;
break;
case RTF_SHPGRP:
- m_aStates.top().nDestinationState = DESTINATION_SHAPEGROUP;
- m_aStates.top().bInShapeGroup = true;
+ {
+ RTFLookahead aLookahead(Strm(), m_pTokenizer->getGroupStart());
+ SAL_WARN_IF(!aLookahead.hasTable(), "writerfilter", "no table in groupshape, should create it!");
+ m_aStates.top().nDestinationState = DESTINATION_SHAPEGROUP;
+ m_aStates.top().bInShapeGroup = true;
+ }
break;
default:
SAL_INFO("writerfilter", "TODO handle destination '" << lcl_RtfToString(nKeyword) << "'");
diff --git a/writerfilter/source/rtftok/rtflookahead.cxx b/writerfilter/source/rtftok/rtflookahead.cxx
new file mode 100644
index 000000000000..0338efd7d86e
--- /dev/null
+++ b/writerfilter/source/rtftok/rtflookahead.cxx
@@ -0,0 +1,130 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <boost/shared_ptr.hpp>
+
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <tools/stream.hxx>
+
+#include <rtflookahead.hxx>
+
+using namespace com::sun::star;
+
+namespace writerfilter {
+namespace rtftok {
+
+RTFLookahead::RTFLookahead(SvStream& rStream, sal_Size nGroupStart)
+ : m_rStream(rStream),
+ m_bHasTable(false)
+{
+ sal_Size nPos = m_rStream.Tell();
+ m_rStream.Seek(nGroupStart);
+ uno::Reference<task::XStatusIndicator> xStatusIndicator;
+ m_pTokenizer.reset(new RTFTokenizer(*this, &m_rStream, xStatusIndicator));
+ m_pTokenizer->resolveParse();
+ m_rStream.Seek(nPos);
+}
+
+RTFLookahead::~RTFLookahead()
+{
+}
+
+int RTFLookahead::dispatchDestination(RTFKeyword /*nKeyword*/)
+{
+ return 0;
+}
+
+int RTFLookahead::dispatchFlag(RTFKeyword nKeyword)
+{
+ if (nKeyword == RTF_INTBL)
+ m_bHasTable = true;
+ return 0;
+}
+
+int RTFLookahead::dispatchSymbol(RTFKeyword /*nKeyword*/)
+{
+ return 0;
+}
+
+int RTFLookahead::dispatchToggle(RTFKeyword /*nKeyword*/, bool /*bParam*/, int /*nParam*/)
+{
+ return 0;
+}
+
+int RTFLookahead::dispatchValue(RTFKeyword /*nKeyword*/, int /*nParam*/)
+{
+ return 0;
+}
+
+int RTFLookahead::resolveChars(char ch)
+{
+ while(!m_rStream.IsEof() && (ch != '{' && ch != '}' && ch != '\\'))
+ m_rStream >> ch;
+ if (!m_rStream.IsEof())
+ m_rStream.SeekRel(-1);
+ return 0;
+}
+
+int RTFLookahead::pushState()
+{
+ m_pTokenizer->pushGroup();
+ return 0;
+}
+
+int RTFLookahead::popState()
+{
+ m_pTokenizer->popGroup();
+ return 0;
+}
+
+RTFDestinationState RTFLookahead::getDestinationState()
+{
+ return DESTINATION_NORMAL;
+}
+
+void RTFLookahead::setDestinationState(RTFDestinationState /*nDestinationState*/)
+{
+}
+
+RTFInternalState RTFLookahead::getInternalState()
+{
+ return INTERNAL_NORMAL;
+}
+
+void RTFLookahead::setInternalState(RTFInternalState /*nInternalState*/)
+{
+}
+
+bool RTFLookahead::getSkipUnknown()
+{
+ return false;
+}
+
+void RTFLookahead::setSkipUnknown(bool /*bSkipUnknown*/)
+{
+}
+
+void RTFLookahead::finishSubstream()
+{
+}
+
+bool RTFLookahead::isSubstream() const
+{
+ return false;
+}
+
+bool RTFLookahead::hasTable()
+{
+ return m_bHasTable;
+}
+
+} // namespace rtftok
+} // namespace writerfilter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtflookahead.hxx b/writerfilter/source/rtftok/rtflookahead.hxx
new file mode 100644
index 000000000000..958700edb27b
--- /dev/null
+++ b/writerfilter/source/rtftok/rtflookahead.hxx
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef _RTFLOOKAHEAD_HXX_
+#define _RTFLOOKAHEAD_HXX_
+
+#include <rtflistener.hxx>
+#include <rtftokenizer.hxx>
+
+class SvStream;
+
+namespace writerfilter {
+ namespace rtftok {
+ /**
+ * This acts like an importer, but used for looking ahead, e.g. to
+ * determine if the current group contains a table, etc.
+ */
+ class RTFLookahead : public RTFListener
+ {
+ public:
+ RTFLookahead(SvStream& rStream, sal_Size nGroupStart);
+ virtual ~RTFLookahead();
+ virtual int dispatchDestination(RTFKeyword nKeyword);
+ virtual int dispatchFlag(RTFKeyword nKeyword);
+ virtual int dispatchSymbol(RTFKeyword nKeyword);
+ virtual int dispatchToggle(RTFKeyword nKeyword, bool bParam, int nParam);
+ virtual int dispatchValue(RTFKeyword nKeyword, int nParam);
+ virtual int resolveChars(char ch);
+ virtual int pushState();
+ virtual int popState();
+ virtual RTFDestinationState getDestinationState();
+ virtual void setDestinationState(RTFDestinationState nDestinationState);
+ virtual RTFInternalState getInternalState();
+ virtual void setInternalState(RTFInternalState nInternalState);
+ virtual bool getSkipUnknown();
+ virtual void setSkipUnknown(bool bSkipUnknown);
+ virtual void finishSubstream();
+ virtual bool isSubstream() const;
+ bool hasTable();
+ private:
+ boost::shared_ptr<RTFTokenizer> m_pTokenizer;
+ SvStream& m_rStream;
+ bool m_bHasTable;
+ };
+ } // namespace rtftok
+} // namespace writerfilter
+
+#endif // _RTFDOCUMENTIMPL_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */