[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