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 <[email protected]> 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 <[email protected]> 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 _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
