[Libreoffice-commits] core.git: 2 commits - writerfilter/Library_writerfilter.mk writerfilter/source
Miklos Vajna
vmiklos at suse.cz
Fri Jul 5 09:11:28 PDT 2013
writerfilter/Library_writerfilter.mk | 1
writerfilter/source/rtftok/rtfdocumentimpl.cxx | 9 +
writerfilter/source/rtftok/rtflookahead.cxx | 130 +++++++++++++++++++++++++
writerfilter/source/rtftok/rtflookahead.hxx | 56 ++++++++++
writerfilter/source/rtftok/rtftokenizer.cxx | 9 +
writerfilter/source/rtftok/rtftokenizer.hxx | 2
6 files changed, 204 insertions(+), 3 deletions(-)
New commits:
commit 05f0859afba779ce28d24e3195d8266d616259d1
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Fri Jul 5 17:38:12 2013 +0200
writerfilter: add RTFLookahead to be able to look ahead during import
Change-Id: I1da765373c352c8a2aa486fe6210b16bf492728c
diff --git a/writerfilter/Library_writerfilter.mk b/writerfilter/Library_writerfilter.mk
index 1993590..4fab4aa 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 56d8a1b..73d06c4 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 0000000..0338efd
--- /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 0000000..958700e
--- /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: */
commit 26bc5a20b39df07abce37ccf8717221ffe3d8373
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Fri Jul 5 16:57:03 2013 +0200
RTFTokenizer: remember start pos of current group
Change-Id: I953ca1d3fb5532ac8261ef0def033a4c0fcd79c6
diff --git a/writerfilter/source/rtftok/rtftokenizer.cxx b/writerfilter/source/rtftok/rtftokenizer.cxx
index 7d3c2dd..fc99189 100644
--- a/writerfilter/source/rtftok/rtftokenizer.cxx
+++ b/writerfilter/source/rtftok/rtftokenizer.cxx
@@ -31,7 +31,8 @@ RTFTokenizer::RTFTokenizer(RTFListener& rImport, SvStream* pInStream, uno::Refer
m_xStatusIndicator(xStatusIndicator),
m_nGroup(0),
m_nLineNumber(0),
- m_nLineStartPos(0)
+ m_nLineStartPos(0),
+ m_nGroupStart(0)
{
if (!RTFTokenizer::m_bControlWordsSorted)
{
@@ -96,6 +97,7 @@ int RTFTokenizer::resolveParse()
switch (ch)
{
case '{':
+ m_nGroupStart = Strm().Tell() - 1;
ret = m_rImport.pushState();
if (ret)
return ret;
@@ -336,6 +338,11 @@ OUString RTFTokenizer::getPosition()
return aRet.makeStringAndClear();
}
+sal_Size RTFTokenizer::getGroupStart()
+{
+ return m_nGroupStart;
+}
+
} // namespace rtftok
} // namespace writerfilter
diff --git a/writerfilter/source/rtftok/rtftokenizer.hxx b/writerfilter/source/rtftok/rtftokenizer.hxx
index df452fb..b055b8c 100644
--- a/writerfilter/source/rtftok/rtftokenizer.hxx
+++ b/writerfilter/source/rtftok/rtftokenizer.hxx
@@ -33,6 +33,7 @@ namespace writerfilter {
/// To be invoked by the popState() callback to single when the importer leaves a group.
void popGroup();
OUString getPosition();
+ sal_Size getGroupStart();
private:
SvStream& Strm();
int resolveKeyword();
@@ -48,6 +49,7 @@ namespace writerfilter {
int m_nGroup;
sal_Int32 m_nLineNumber;
sal_Int32 m_nLineStartPos;
+ sal_Size m_nGroupStart;
};
} // namespace rtftok
} // namespace writerfilter
More information about the Libreoffice-commits
mailing list