summaryrefslogtreecommitdiff
path: root/oox/inc/oox/xls/excelhandlers.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'oox/inc/oox/xls/excelhandlers.hxx')
-rw-r--r--oox/inc/oox/xls/excelhandlers.hxx386
1 files changed, 386 insertions, 0 deletions
diff --git a/oox/inc/oox/xls/excelhandlers.hxx b/oox/inc/oox/xls/excelhandlers.hxx
new file mode 100644
index 000000000000..986f42aadba4
--- /dev/null
+++ b/oox/inc/oox/xls/excelhandlers.hxx
@@ -0,0 +1,386 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef OOX_XLS_EXCELHANDLERS_HXX
+#define OOX_XLS_EXCELHANDLERS_HXX
+
+#include "oox/core/fragmenthandler2.hxx"
+#include "oox/xls/worksheethelper.hxx"
+
+namespace oox {
+namespace xls {
+
+// ============================================================================
+// ============================================================================
+
+/** Context handler derived from the WorkbookHelper helper class.
+
+ Used to import contexts in global workbook fragments.
+ */
+class OoxWorkbookContextBase : public ::oox::core::ContextHandler2, public WorkbookHelper
+{
+public:
+ template< typename ParentType >
+ explicit OoxWorkbookContextBase( ParentType& rParent );
+};
+
+// ----------------------------------------------------------------------------
+
+template< typename ParentType >
+OoxWorkbookContextBase::OoxWorkbookContextBase( ParentType& rParent ) :
+ ::oox::core::ContextHandler2( rParent ),
+ WorkbookHelper( rParent )
+{
+}
+
+// ============================================================================
+
+/** Context handler derived from the WorksheetHelper helper class.
+
+ Used to import contexts in sheet fragments.
+ */
+class OoxWorksheetContextBase : public ::oox::core::ContextHandler2, public WorksheetHelperRoot
+{
+public:
+ template< typename ParentType >
+ explicit OoxWorksheetContextBase(
+ ParentType& rParent,
+ ISegmentProgressBarRef xProgressBar,
+ WorksheetType eSheetType,
+ sal_Int16 nSheet );
+
+ template< typename ParentType >
+ explicit OoxWorksheetContextBase( ParentType& rParent );
+};
+
+// ----------------------------------------------------------------------------
+
+template< typename ParentType >
+OoxWorksheetContextBase::OoxWorksheetContextBase( ParentType& rParent,
+ ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
+ ::oox::core::ContextHandler2( rParent ),
+ WorksheetHelperRoot( rParent, xProgressBar, eSheetType, nSheet )
+{
+}
+
+template< typename ParentType >
+OoxWorksheetContextBase::OoxWorksheetContextBase( ParentType& rParent ) :
+ ::oox::core::ContextHandler2( rParent ),
+ WorksheetHelperRoot( rParent )
+{
+}
+
+// ============================================================================
+
+/** Fragment handler derived from the WorkbookHelper helper class.
+
+ Used to import global workbook fragments.
+ */
+class OoxWorkbookFragmentBase : public ::oox::core::FragmentHandler2, public WorkbookHelper
+{
+public:
+ explicit OoxWorkbookFragmentBase(
+ const WorkbookHelper& rHelper,
+ const ::rtl::OUString& rFragmentPath );
+};
+
+// ============================================================================
+
+/** Fragment handler derived from the WorksheetHelper helper class.
+
+ Used to import sheet fragments.
+ */
+class OoxWorksheetFragmentBase : public ::oox::core::FragmentHandler2, public WorksheetHelperRoot
+{
+public:
+ explicit OoxWorksheetFragmentBase(
+ const WorkbookHelper& rHelper,
+ const ::rtl::OUString& rFragmentPath,
+ ISegmentProgressBarRef xProgressBar,
+ WorksheetType eSheetType,
+ sal_Int16 nSheet );
+
+ explicit OoxWorksheetFragmentBase(
+ const WorksheetHelper& rHelper,
+ const ::rtl::OUString& rFragmentPath );
+};
+
+// ============================================================================
+// ============================================================================
+
+/** An enumeration for all types of fragments in a BIFF workbook stream. */
+enum BiffFragmentType
+{
+ BIFF_FRAGMENT_GLOBALS, /// Workbook globals fragment.
+ BIFF_FRAGMENT_WORKSHEET, /// Worksheet fragment.
+ BIFF_FRAGMENT_CHARTSHEET, /// Chart sheet fragment.
+ BIFF_FRAGMENT_MACROSHEET, /// Macro sheet fragment.
+ BIFF_FRAGMENT_MODULESHEET, /// BIFF5 VB module fragment.
+ BIFF_FRAGMENT_EMPTYSHEET, /// Sheet fragment of unsupported type.
+ BIFF_FRAGMENT_WORKSPACE, /// BIFF4 workspace/workbook globals.
+ BIFF_FRAGMENT_UNKNOWN /// Unknown fragment/error.
+};
+
+// ============================================================================
+
+/** Base class for all BIFF context handlers and fragment handlers.
+
+ This base class holds a reference to the BIFF input stream which can be
+ accessed in all derived classes.
+ */
+class BiffHandlerBase
+{
+protected:
+ inline explicit BiffHandlerBase( BiffInputStream& rStrm ) : mrStrm( rStrm ) {}
+ virtual ~BiffHandlerBase();
+
+ /** Skips a block of records up to the specified end record.
+
+ Skips all records until next end record. When this function returns,
+ stream points to the end record, and the next call of startNextRecord()
+ at the stream will start the record following the end record.
+
+ The identifier of the record that is active while this function is
+ called is used as start record identifier. This identifier is used to
+ correctly skip embedded record blocks with the same start and end
+ record identifier.
+
+ @return True = stream points to the end record.
+ */
+ bool skipRecordBlock( sal_uInt16 nEndRecId );
+
+ /** @return True = current record identifier is a BOF record. */
+ bool isBofRecord() const;
+
+protected:
+ BiffInputStream& mrStrm;
+};
+
+// ============================================================================
+
+/** Base class for all BIFF context handlers.
+
+ Derived handlers have to implement the importRecord() function that has to
+ import the record the BIFF input stream currently points to.
+ */
+class BiffContextHandler : public BiffHandlerBase
+{
+public:
+ /** Derived classes have to implement importing the current record. */
+ virtual void importRecord() = 0;
+
+protected:
+ explicit BiffContextHandler( const BiffHandlerBase& rParent );
+};
+
+// ============================================================================
+
+/** Context handler derived from the WorkbookHelper helper class.
+
+ Used to import contexts in global workbook fragments.
+ */
+class BiffWorkbookContextBase : public BiffContextHandler, public WorkbookHelper
+{
+protected:
+ template< typename ParentType >
+ explicit BiffWorkbookContextBase( const ParentType& rParent );
+};
+
+// ----------------------------------------------------------------------------
+
+template< typename ParentType >
+BiffWorkbookContextBase::BiffWorkbookContextBase( const ParentType& rParent ) :
+ BiffContextHandler( rParent ),
+ WorkbookHelper( rParent )
+{
+}
+
+// ============================================================================
+
+/** Context handler derived from the WorksheetHelper helper class.
+
+ Used to import contexts in sheet fragments.
+ */
+class BiffWorksheetContextBase : public BiffContextHandler, public WorksheetHelperRoot
+{
+protected:
+ template< typename ParentType >
+ explicit BiffWorksheetContextBase(
+ const ParentType& rParent,
+ ISegmentProgressBarRef xProgressBar,
+ WorksheetType eSheetType,
+ sal_Int16 nSheet );
+
+ template< typename ParentType >
+ explicit BiffWorksheetContextBase( const ParentType& rParent );
+};
+
+// ----------------------------------------------------------------------------
+
+template< typename ParentType >
+BiffWorksheetContextBase::BiffWorksheetContextBase( const ParentType& rParent,
+ ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) :
+ BiffContextHandler( rParent ),
+ WorksheetHelperRoot( rParent, xProgressBar, eSheetType, nSheet )
+{
+}
+
+template< typename ParentType >
+BiffWorksheetContextBase::BiffWorksheetContextBase( const ParentType& rParent ) :
+ BiffContextHandler( rParent ),
+ WorksheetHelperRoot( rParent )
+{
+}
+
+// ============================================================================
+
+namespace prv {
+
+struct BiffFragmentStreamOwner
+{
+ typedef ::boost::shared_ptr< BinaryXInputStream > XInputStreamRef;
+ typedef ::boost::shared_ptr< BiffInputStream > BiffInputStreamRef;
+
+ XInputStreamRef mxXInStrm;
+ BiffInputStreamRef mxBiffStrm;
+
+ explicit BiffFragmentStreamOwner( const ::oox::core::FilterBase& rFilter, const ::rtl::OUString& rStrmName );
+ virtual ~BiffFragmentStreamOwner();
+};
+
+} // namespace prv
+
+// ----------------------------------------------------------------------------
+
+class BiffFragmentHandler : private prv::BiffFragmentStreamOwner, public BiffHandlerBase
+{
+public:
+ /** Imports the fragment, returns true, if EOF record has been reached. */
+ virtual bool importFragment() = 0;
+
+protected:
+ /** Opens the stream with the passed full name. */
+ explicit BiffFragmentHandler(
+ const ::oox::core::FilterBase& rFilter,
+ const ::rtl::OUString& rStrmName );
+
+ /** Reuses the stream of the passed fragment. */
+ explicit BiffFragmentHandler( const BiffFragmentHandler& rHandler );
+
+ /** Starts a new fragment in a workbbok stream and returns the fragment type.
+
+ The passed stream must point before a BOF record. The function will
+ try to start the next record and read the contents of the BOF record,
+ if extant.
+
+ @return Fragment type according to the imported BOF record.
+ */
+ BiffFragmentType startFragment( BiffType eBiff );
+
+ /** Starts a new fragment at a specific position in the workbbok stream and
+ returns the fragment type.
+
+ The passed record handle must specify the stream position of the BOF
+ record of the fragment substream. The function will try to start the
+ next record and read the contents of the BOF record, if extant.
+
+ @return Fragment type according to the imported BOF record.
+ */
+ BiffFragmentType startFragment( BiffType eBiff, sal_Int64 nRecHandle );
+
+ /** Skips the current fragment up to its trailing EOF record.
+
+ Skips all records until next EOF record. When this function returns,
+ stream points to the EOF record, and the next call of startNextRecord()
+ at the stream will start the record following the EOF record.
+
+ Embedded fragments enclosed in BOF/EOF records (e.g. embedded chart
+ objects) are skipped correctly.
+
+ @return True = stream points to the EOF record of the current fragment.
+ */
+ bool skipFragment();
+
+private:
+ /** Implementation helper for the startFragment() functions. */
+ BiffFragmentType implStartFragment( BiffType eBiff );
+};
+
+// ============================================================================
+
+/** Fragment handler derived from the WorkbookHelper helper class.
+
+ Used to import global workbook fragments.
+ */
+class BiffWorkbookFragmentBase : public BiffFragmentHandler, public WorkbookHelper
+{
+protected:
+ explicit BiffWorkbookFragmentBase(
+ const WorkbookHelper& rHelper,
+ const ::rtl::OUString& rStrmName,
+ bool bCloneDecoder = false );
+};
+
+// ============================================================================
+
+/** Fragment handler derived from the WorksheetHelper helper class.
+
+ Used to import sheet fragments.
+ */
+class BiffWorksheetFragmentBase : public BiffFragmentHandler, public WorksheetHelperRoot
+{
+protected:
+ explicit BiffWorksheetFragmentBase(
+ const BiffWorkbookFragmentBase& rParent,
+ ISegmentProgressBarRef xProgressBar,
+ WorksheetType eSheetType,
+ sal_Int16 nSheet );
+};
+
+// ============================================================================
+
+/** Special fragment handler for worksheets that have to be skipped.
+ */
+class BiffSkipWorksheetFragment : public BiffWorksheetFragmentBase
+{
+public:
+ explicit BiffSkipWorksheetFragment(
+ const BiffWorkbookFragmentBase& rParent,
+ ISegmentProgressBarRef xProgressBar,
+ sal_Int16 nSheet );
+
+ virtual bool importFragment();
+};
+
+// ============================================================================
+// ============================================================================
+
+} // namespace xls
+} // namespace oox
+
+#endif
+