diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2013-07-05 17:38:12 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2013-07-05 18:11:07 +0200 |
commit | 05f0859afba779ce28d24e3195d8266d616259d1 (patch) | |
tree | e9ce2928912360e1d77ec9a1cbeb0f8e82f996eb | |
parent | 26bc5a20b39df07abce37ccf8717221ffe3d8373 (diff) |
writerfilter: add RTFLookahead to be able to look ahead during import
Change-Id: I1da765373c352c8a2aa486fe6210b16bf492728c
-rw-r--r-- | writerfilter/Library_writerfilter.mk | 1 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 9 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtflookahead.cxx | 130 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtflookahead.hxx | 56 |
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: */ |