summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dbaccess/source/core/recovery/dbdocrecovery.cxx6
-rw-r--r--dbaccess/source/core/recovery/makefile.mk3
-rw-r--r--dbaccess/source/core/recovery/settingsimport.cxx294
-rw-r--r--dbaccess/source/core/recovery/settingsimport.hxx190
-rw-r--r--dbaccess/source/core/recovery/storagestream.cxx33
-rw-r--r--dbaccess/source/core/recovery/storagestream.hxx30
-rw-r--r--dbaccess/source/core/recovery/storagexmlstream.cxx42
-rw-r--r--dbaccess/source/core/recovery/storagexmlstream.hxx28
-rw-r--r--dbaccess/source/core/recovery/subcomponentrecovery.cxx149
-rw-r--r--dbaccess/source/core/recovery/subcomponentrecovery.hxx7
10 files changed, 774 insertions, 8 deletions
diff --git a/dbaccess/source/core/recovery/dbdocrecovery.cxx b/dbaccess/source/core/recovery/dbdocrecovery.cxx
index 76a67794ee53..4e45dc08d9c4 100644
--- a/dbaccess/source/core/recovery/dbdocrecovery.cxx
+++ b/dbaccess/source/core/recovery/dbdocrecovery.cxx
@@ -382,12 +382,6 @@ namespace dbaccess
)
{
const SubComponentType eComponentType = map->first;
- if ( ( eComponentType != FORM ) && ( eComponentType != REPORT ) )
- {
- // nobody saves tables/queries/relations at the moment, so encountering those is worth an assertion
- OSL_ENSURE( false, "DatabaseDocumentRecovery::recoverSubDocuments: only embedded objects can be recovered currently!" );
- continue;
- }
// the storage for all components of the current type
Reference< XStorage > xComponentsStor( xRecoveryStorage->openStorageElement(
diff --git a/dbaccess/source/core/recovery/makefile.mk b/dbaccess/source/core/recovery/makefile.mk
index 8679a23dcfec..c13334bbc9d9 100644
--- a/dbaccess/source/core/recovery/makefile.mk
+++ b/dbaccess/source/core/recovery/makefile.mk
@@ -49,7 +49,8 @@ SLOFILES= \
$(SLO)$/storagestream.obj \
$(SLO)$/storagexmlstream.obj \
$(SLO)$/storagetextstream.obj \
- $(SLO)$/subcomponentrecovery.obj
+ $(SLO)$/subcomponentrecovery.obj \
+ $(SLO)$/settingsimport.obj
# --- Targets ----------------------------------
diff --git a/dbaccess/source/core/recovery/settingsimport.cxx b/dbaccess/source/core/recovery/settingsimport.cxx
new file mode 100644
index 000000000000..566bf42ae847
--- /dev/null
+++ b/dbaccess/source/core/recovery/settingsimport.cxx
@@ -0,0 +1,294 @@
+/*************************************************************************
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2009 by Sun Microsystems, Inc.
+*
+* 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.
+************************************************************************/
+
+#include "precompiled_dbaccess.hxx"
+
+#include "settingsimport.hxx"
+
+/** === begin UNO includes === **/
+/** === end UNO includes === **/
+
+#include <tools/diagnose_ex.h>
+#include <xmloff/xmltoken.hxx>
+#include <xmloff/xmluconv.hxx>
+
+//........................................................................
+namespace dbaccess
+{
+//........................................................................
+
+ /** === begin UNO using === **/
+ using ::com::sun::star::uno::Reference;
+ using ::com::sun::star::uno::XInterface;
+ using ::com::sun::star::uno::UNO_QUERY;
+ using ::com::sun::star::uno::UNO_QUERY_THROW;
+ using ::com::sun::star::uno::UNO_SET_THROW;
+ using ::com::sun::star::uno::Exception;
+ using ::com::sun::star::uno::RuntimeException;
+ using ::com::sun::star::uno::Any;
+ using ::com::sun::star::uno::makeAny;
+ using ::com::sun::star::uno::Sequence;
+ using ::com::sun::star::uno::Type;
+ using ::com::sun::star::xml::sax::XAttributeList;
+ /** === end UNO using === **/
+
+ //====================================================================
+ //= SettingsImport
+ //====================================================================
+ //--------------------------------------------------------------------
+ SettingsImport::SettingsImport()
+ :m_refCount( 0 )
+ {
+ }
+
+ //--------------------------------------------------------------------
+ SettingsImport::~SettingsImport()
+ {
+ }
+
+ //--------------------------------------------------------------------
+ oslInterlockedCount SAL_CALL SettingsImport::acquire()
+ {
+ return osl_incrementInterlockedCount( &m_refCount );
+ }
+
+ //--------------------------------------------------------------------
+ oslInterlockedCount SAL_CALL SettingsImport::release()
+ {
+ oslInterlockedCount newCount = osl_decrementInterlockedCount( &m_refCount );
+ if ( newCount == 0 )
+ delete this;
+ return newCount;
+ }
+
+ //--------------------------------------------------------------------
+ void SettingsImport::startElement( const Reference< XAttributeList >& i_rAttributes )
+ {
+ // find the name of the setting
+ if ( i_rAttributes.is() )
+ {
+ m_sItemName = i_rAttributes->getValueByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "config:name" ) ) );
+ m_sItemType = i_rAttributes->getValueByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "config:type" ) ) );
+ }
+ }
+
+ //--------------------------------------------------------------------
+ void SettingsImport::endElement()
+ {
+ }
+
+ //--------------------------------------------------------------------
+ void SettingsImport::characters( const ::rtl::OUString& i_rCharacters )
+ {
+ m_aCharacters.append( i_rCharacters );
+ }
+
+ //--------------------------------------------------------------------
+ void SettingsImport::split( const ::rtl::OUString& i_rElementName, ::rtl::OUString& o_rNamespace, ::rtl::OUString& o_rLocalName )
+ {
+ o_rNamespace = ::rtl::OUString();
+ o_rLocalName = i_rElementName;
+ const sal_Int32 nSeparatorPos = i_rElementName.indexOf( ':' );
+ if ( nSeparatorPos > -1 )
+ {
+ o_rNamespace = i_rElementName.copy( 0, nSeparatorPos );
+ o_rLocalName = i_rElementName.copy( nSeparatorPos + 1 );
+ }
+
+ OSL_ENSURE( o_rNamespace.equalsAscii( "config" ), "SettingsImport::split: unexpected namespace!" );
+ // our recovery file is kind of hand-made, so there shouldn't be anything else than "config".
+ // If there is, then just ignore it ...
+ }
+
+ //====================================================================
+ //= IgnoringSettingsImport
+ //====================================================================
+ //--------------------------------------------------------------------
+ ::rtl::Reference< SettingsImport > IgnoringSettingsImport::nextState( const ::rtl::OUString& i_rElementName )
+ {
+ (void)i_rElementName;
+ return this;
+ }
+
+ //====================================================================
+ //= OfficeSettingsImport
+ //====================================================================
+ //--------------------------------------------------------------------
+ OfficeSettingsImport::OfficeSettingsImport( ::comphelper::NamedValueCollection& o_rSettings )
+ :m_rSettings( o_rSettings )
+ {
+ }
+
+ //--------------------------------------------------------------------
+ OfficeSettingsImport::~OfficeSettingsImport()
+ {
+ }
+
+ //--------------------------------------------------------------------
+ ::rtl::Reference< SettingsImport > OfficeSettingsImport::nextState( const ::rtl::OUString& i_rElementName )
+ {
+ // separate the namespace part from the element name
+ ::rtl::OUString sNamespace;
+ ::rtl::OUString sLocalName;
+ split( i_rElementName, sNamespace, sLocalName );
+
+ if ( sLocalName.equalsAscii( "config-item-set" ) )
+ return new ConfigItemSetImport( m_rSettings );
+
+#if OSL_DEBUG_LEVEL > 0
+ ::rtl::OString sMessage( "unknown (or unsupported at this place) element name '" );
+ sMessage += ::rtl::OUStringToOString( i_rElementName, RTL_TEXTENCODING_UTF8 );
+ sMessage += "', ignoring";
+ OSL_ENSURE( false, sMessage.getStr() );
+#endif
+ return new IgnoringSettingsImport;
+ }
+
+ //====================================================================
+ //= ConfigItemImport
+ //====================================================================
+ //--------------------------------------------------------------------
+ ConfigItemImport::ConfigItemImport( ::comphelper::NamedValueCollection& o_rSettings )
+ :m_rSettings( o_rSettings )
+ {
+ }
+
+ //--------------------------------------------------------------------
+ ConfigItemImport::~ConfigItemImport()
+ {
+ }
+
+ //--------------------------------------------------------------------
+ ::rtl::Reference< SettingsImport > ConfigItemImport::nextState( const ::rtl::OUString& i_rElementName )
+ {
+ OSL_ENSURE( false, "ConfigItemImport::nextState: unexpected: this class is responsible for child-less items only!" );
+ (void)i_rElementName;
+ return new IgnoringSettingsImport;
+ }
+
+ //--------------------------------------------------------------------
+ void ConfigItemImport::endElement()
+ {
+ SettingsImport::endElement();
+
+ const ::rtl::OUString sItemName( getItemName() );
+ ENSURE_OR_RETURN_VOID( sItemName.getLength(), "no item name -> no item value" );
+ Any aValue;
+ getItemValue( aValue );
+ m_rSettings.put( sItemName, aValue );
+ }
+
+ //--------------------------------------------------------------------
+ void ConfigItemImport::getItemValue( ::com::sun::star::uno::Any& o_rValue ) const
+ {
+ o_rValue.clear();
+
+ // the characters building up th evalue
+ ::rtl::OUStringBuffer aCharacters( getAccumulatedCharacters() );
+ const ::rtl::OUString sValue = aCharacters.makeStringAndClear();
+
+ const ::rtl::OUString& rItemType( getItemType() );
+ ENSURE_OR_RETURN_VOID( rItemType.getLength(), "no item type -> no item value" );
+
+ if ( ::xmloff::token::IsXMLToken( rItemType, ::xmloff::token::XML_INT ) )
+ {
+ sal_Int32 nValue(0);
+ if ( SvXMLUnitConverter::convertNumber( nValue, sValue ) )
+ o_rValue <<= nValue;
+ else
+ {
+ OSL_ENSURE( false, "ConfigItemImport::getItemValue: could not convert an int value!" );
+ }
+ }
+ else if ( ::xmloff::token::IsXMLToken( rItemType, ::xmloff::token::XML_BOOLEAN ) )
+ {
+ sal_Bool nValue( sal_False );
+ if ( SvXMLUnitConverter::convertBool( nValue, sValue ) )
+ o_rValue <<= nValue;
+ else
+ {
+ OSL_ENSURE( false, "ConfigItemImport::getItemValue: could not convert a boolean value!" );
+ }
+ }
+ else if ( ::xmloff::token::IsXMLToken( rItemType, ::xmloff::token::XML_STRING ) )
+ {
+ o_rValue <<= sValue;
+ }
+#if OSL_DEBUG_LEVEL > 0
+ else
+ {
+ ::rtl::OString sMessage( "ConfigItemImport::getItemValue: unsupported item type '" );
+ sMessage += ::rtl::OUStringToOString( rItemType, RTL_TEXTENCODING_UTF8 );
+ sMessage += "', ignoring";
+ OSL_ENSURE( false, sMessage.getStr() );
+ }
+#endif
+ }
+
+ //====================================================================
+ //= ConfigItemSetImport
+ //====================================================================
+ //--------------------------------------------------------------------
+ ConfigItemSetImport::ConfigItemSetImport( ::comphelper::NamedValueCollection& o_rSettings )
+ :ConfigItemImport( o_rSettings )
+ {
+ }
+
+ //--------------------------------------------------------------------
+ ConfigItemSetImport::~ConfigItemSetImport()
+ {
+ }
+
+ //--------------------------------------------------------------------
+ ::rtl::Reference< SettingsImport > ConfigItemSetImport::nextState( const ::rtl::OUString& i_rElementName )
+ {
+ // separate the namespace part from the element name
+ ::rtl::OUString sNamespace;
+ ::rtl::OUString sLocalName;
+ split( i_rElementName, sNamespace, sLocalName );
+
+ if ( sLocalName.equalsAscii( "config-item-set" ) )
+ return new ConfigItemSetImport( m_aChildSettings );
+ if ( sLocalName.equalsAscii( "config-item" ) )
+ return new ConfigItemImport( m_aChildSettings );
+
+#if OSL_DEBUG_LEVEL > 0
+ ::rtl::OString sMessage( "unknown element name '" );
+ sMessage += ::rtl::OUStringToOString( i_rElementName, RTL_TEXTENCODING_UTF8 );
+ sMessage += "', ignoring";
+ OSL_ENSURE( false, sMessage.getStr() );
+#endif
+ return new IgnoringSettingsImport;
+ }
+
+ //--------------------------------------------------------------------
+ void ConfigItemSetImport::getItemValue( Any& o_rValue ) const
+ {
+ o_rValue <<= m_aChildSettings.getPropertyValues();
+ }
+
+//........................................................................
+} // namespace dbaccess
+//........................................................................
diff --git a/dbaccess/source/core/recovery/settingsimport.hxx b/dbaccess/source/core/recovery/settingsimport.hxx
new file mode 100644
index 000000000000..3415092ee93a
--- /dev/null
+++ b/dbaccess/source/core/recovery/settingsimport.hxx
@@ -0,0 +1,190 @@
+/*************************************************************************
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2009 by Sun Microsystems, Inc.
+*
+* 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 SETTINGSIMPORT_HXX
+#define SETTINGSIMPORT_HXX
+
+/** === begin UNO includes === **/
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+/** === end UNO includes === **/
+
+#include <comphelper/namedvaluecollection.hxx>
+#include <rtl/ref.hxx>
+#include <rtl/ustrbuf.hxx>
+
+//........................................................................
+namespace dbaccess
+{
+//........................................................................
+
+ //====================================================================
+ //= SettingsImport
+ //====================================================================
+ /** a simplified version of xmloff/DocumentSettingsContext
+
+ It would be nice if the DocumentSettingsContext would not be that tightly interwoven with the SvXMLImport
+ class, so we could re-use it here ...
+ */
+ class SettingsImport : public ::rtl::IReference
+ {
+ public:
+ SettingsImport();
+
+ // IReference
+ virtual oslInterlockedCount SAL_CALL acquire();
+ virtual oslInterlockedCount SAL_CALL release();
+
+ // own overriables
+ virtual ::rtl::Reference< SettingsImport > nextState(
+ const ::rtl::OUString& i_rElementName
+ ) = 0;
+ virtual void startElement(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& i_rAttributes
+ );
+ virtual void endElement();
+ virtual void characters( const ::rtl::OUString& i_rCharacters );
+
+ protected:
+ virtual ~SettingsImport();
+
+ protected:
+ static void split( const ::rtl::OUString& i_rElementName, ::rtl::OUString& o_rNamespace, ::rtl::OUString& o_rLocalName );
+
+ protected:
+ const ::rtl::OUString& getItemName() const { return m_sItemName; }
+ const ::rtl::OUString& getItemType() const { return m_sItemType; }
+ const ::rtl::OUStringBuffer& getAccumulatedCharacters() const { return m_aCharacters; }
+
+ private:
+ oslInterlockedCount m_refCount;
+ // value of the config:name attribute, if any
+ ::rtl::OUString m_sItemName;
+ // value of the config:type attribute, if any
+ ::rtl::OUString m_sItemType;
+ // accumulated characters, if any
+ ::rtl::OUStringBuffer m_aCharacters;
+ };
+
+ //====================================================================
+ //= IgnoringSettingsImport
+ //====================================================================
+ class IgnoringSettingsImport : public SettingsImport
+ {
+ public:
+ IgnoringSettingsImport()
+ {
+ }
+
+ // SettingsImport overridables
+ virtual ::rtl::Reference< SettingsImport > nextState(
+ const ::rtl::OUString& i_rElementName
+ );
+
+ private:
+ ~IgnoringSettingsImport()
+ {
+ }
+ };
+
+ //====================================================================
+ //= OfficeSettingsImport
+ //====================================================================
+ class OfficeSettingsImport : public SettingsImport
+ {
+ public:
+ OfficeSettingsImport( ::comphelper::NamedValueCollection& o_rSettings );
+
+ // SettingsImport overridables
+ virtual ::rtl::Reference< SettingsImport > nextState(
+ const ::rtl::OUString& i_rElementName
+ );
+
+ protected:
+ ~OfficeSettingsImport();
+
+ private:
+ // the settings collection to which |this| will contribute a single setting
+ ::comphelper::NamedValueCollection& m_rSettings;
+ };
+
+ //====================================================================
+ //= ConfigItemSetImport
+ //====================================================================
+ class ConfigItemImport : public SettingsImport
+ {
+ public:
+ ConfigItemImport( ::comphelper::NamedValueCollection& o_rSettings );
+
+ protected:
+ ~ConfigItemImport();
+
+ public:
+ // SettingsImport overridables
+ virtual ::rtl::Reference< SettingsImport > nextState(
+ const ::rtl::OUString& i_rElementName
+ );
+ virtual void endElement();
+
+ protected:
+ // own overridables
+ /// retrieves the value represented by the element
+ virtual void getItemValue( ::com::sun::star::uno::Any& o_rValue ) const;
+
+ private:
+ // the settings collection to which |this| will contribute a single setting
+ ::comphelper::NamedValueCollection& m_rSettings;
+ };
+
+ //====================================================================
+ //= ConfigItemSetImport
+ //====================================================================
+ class ConfigItemSetImport : public ConfigItemImport
+ {
+ public:
+ ConfigItemSetImport( ::comphelper::NamedValueCollection& o_rSettings );
+
+ protected:
+ ~ConfigItemSetImport();
+
+ public:
+ // SettingsImport overridables
+ virtual ::rtl::Reference< SettingsImport > nextState(
+ const ::rtl::OUString& i_rElementName
+ );
+
+ protected:
+ // ConfigItemImport overridables
+ virtual void getItemValue( ::com::sun::star::uno::Any& o_rValue ) const;
+
+ private:
+ /// the settings represented by our child elements
+ ::comphelper::NamedValueCollection m_aChildSettings;
+ };
+
+//........................................................................
+} // namespace dbaccess
+//........................................................................
+
+#endif // SETTINGSIMPORT_HXX
diff --git a/dbaccess/source/core/recovery/storagestream.cxx b/dbaccess/source/core/recovery/storagestream.cxx
index e8fb99600854..ec6ff49a6098 100644
--- a/dbaccess/source/core/recovery/storagestream.cxx
+++ b/dbaccess/source/core/recovery/storagestream.cxx
@@ -88,6 +88,39 @@ namespace dbaccess
// (legitimately) do not call this method here.
}
+ //====================================================================
+ //= StorageInputStream
+ //====================================================================
+ //--------------------------------------------------------------------
+ StorageInputStream::StorageInputStream( const ::comphelper::ComponentContext& i_rContext,
+ const Reference< XStorage >& i_rParentStorage,
+ const ::rtl::OUString& i_rStreamName
+ )
+ :m_rContext( i_rContext )
+ {
+ ENSURE_OR_THROW( i_rParentStorage.is(), "illegal stream" );
+
+ const Reference< XStream > xStream(
+ i_rParentStorage->openStreamElement( i_rStreamName, ElementModes::READ ), UNO_QUERY_THROW );
+ m_xInputStream.set( xStream->getInputStream(), UNO_SET_THROW );
+ }
+
+ //--------------------------------------------------------------------
+ StorageInputStream::~StorageInputStream()
+ {
+ }
+
+ //--------------------------------------------------------------------
+ void StorageInputStream::close()
+ {
+ ENSURE_OR_RETURN_VOID( m_xInputStream.is(), "already closed" );
+ m_xInputStream->closeInput();
+ m_xInputStream.clear();
+
+ // if you add additional functionality here, be aware that there are derived classes which
+ // (legitimately) do not call this method here.
+ }
+
//........................................................................
} // namespace dbaccess
//........................................................................
diff --git a/dbaccess/source/core/recovery/storagestream.hxx b/dbaccess/source/core/recovery/storagestream.hxx
index a214d3d84d7d..2485cfac24cb 100644
--- a/dbaccess/source/core/recovery/storagestream.hxx
+++ b/dbaccess/source/core/recovery/storagestream.hxx
@@ -72,6 +72,36 @@ namespace dbaccess
m_xOutputStream;
};
+ //====================================================================
+ //= StorageInputStream
+ //====================================================================
+ /** convenience wrapper around a stream living in a storage
+ */
+ class DBACCESS_DLLPRIVATE StorageInputStream
+ {
+ public:
+ StorageInputStream(
+ const ::comphelper::ComponentContext& i_rContext,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& i_rParentStorage,
+ const ::rtl::OUString& i_rStreamName
+ );
+ virtual ~StorageInputStream();
+
+ /** simply calls closeInput on our input stream, override to extend/modify this behavior
+ */
+ virtual void close();
+
+ protected:
+ const ::comphelper::ComponentContext& getContext() const { return m_rContext; }
+ const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >&
+ getInputStream() const { return m_xInputStream; }
+
+ private:
+ const ::comphelper::ComponentContext& m_rContext;
+ ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >
+ m_xInputStream;
+ };
+
//........................................................................
} // namespace dbaccess
//........................................................................
diff --git a/dbaccess/source/core/recovery/storagexmlstream.cxx b/dbaccess/source/core/recovery/storagexmlstream.cxx
index 10c64cc4141c..8405cce75903 100644
--- a/dbaccess/source/core/recovery/storagexmlstream.cxx
+++ b/dbaccess/source/core/recovery/storagexmlstream.cxx
@@ -30,9 +30,11 @@
/** === begin UNO includes === **/
#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
#include <com/sun/star/io/XActiveDataSource.hpp>
+#include <com/sun/star/xml/sax/XParser.hpp>
/** === end UNO includes === **/
#include <comphelper/componentcontext.hxx>
+#include <cppuhelper/implbase1.hxx>
#include <rtl/ref.hxx>
#include <tools/diagnose_ex.h>
#include <xmloff/attrlist.hxx>
@@ -62,6 +64,8 @@ namespace dbaccess
using ::com::sun::star::io::XStream;
using ::com::sun::star::io::XOutputStream;
using ::com::sun::star::io::XActiveDataSource;
+ using ::com::sun::star::xml::sax::XParser;
+ using ::com::sun::star::xml::sax::InputSource;
/** === end UNO using === **/
//==================================================================================================================
@@ -150,6 +154,44 @@ namespace dbaccess
m_pData->xHandler->characters( i_rCharacters );
}
+ //==================================================================================================================
+ //= StorageXMLInputStream_Data
+ //==================================================================================================================
+ struct StorageXMLInputStream_Data
+ {
+ Reference< XParser > xParser;
+ };
+
+ //==================================================================================================================
+ //= StorageXMLInputStream
+ //==================================================================================================================
+ //------------------------------------------------------------------------------------------------------------------
+ StorageXMLInputStream::StorageXMLInputStream( const ::comphelper::ComponentContext& i_rContext,
+ const Reference< XStorage >& i_rParentStorage,
+ const ::rtl::OUString& i_rStreamName )
+ :StorageInputStream( i_rContext, i_rParentStorage, i_rStreamName )
+ ,m_pData( new StorageXMLInputStream_Data )
+ {
+ m_pData->xParser.set( i_rContext.createComponent( "com.sun.star.xml.sax.Parser" ), UNO_QUERY_THROW );
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ void StorageXMLInputStream::import( const Reference< XDocumentHandler >& i_rHandler )
+ {
+ ENSURE_OR_THROW( i_rHandler.is(), "illegal document handler (NULL)" );
+
+ InputSource aInputSource;
+ aInputSource.aInputStream = getInputStream();
+
+ m_pData->xParser->setDocumentHandler( i_rHandler );
+ m_pData->xParser->parseStream( aInputSource );
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ StorageXMLInputStream::~StorageXMLInputStream()
+ {
+ }
+
//......................................................................................................................
} // namespace dbaccess
//......................................................................................................................
diff --git a/dbaccess/source/core/recovery/storagexmlstream.hxx b/dbaccess/source/core/recovery/storagexmlstream.hxx
index 504e6b7ccd25..10a8aaaed5de 100644
--- a/dbaccess/source/core/recovery/storagexmlstream.hxx
+++ b/dbaccess/source/core/recovery/storagexmlstream.hxx
@@ -30,6 +30,7 @@
/** === begin UNO includes === **/
#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
/** === end UNO includes === **/
#include <memory>
@@ -78,6 +79,33 @@ namespace dbaccess
::std::auto_ptr< StorageXMLOutputStream_Data > m_pData;
};
+ //====================================================================
+ //= StorageXMLInputStream
+ //====================================================================
+ struct StorageXMLInputStream_Data;
+ class DBACCESS_DLLPRIVATE StorageXMLInputStream : public StorageInputStream
+ {
+ public:
+ StorageXMLInputStream(
+ const ::comphelper::ComponentContext& i_rContext,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& i_rParentStorage,
+ const ::rtl::OUString& i_rStreamName
+ );
+ ~StorageXMLInputStream();
+
+ void import(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler >& i_rHandler
+ );
+
+ private:
+ StorageXMLInputStream(); // never implemented
+ StorageXMLInputStream( const StorageXMLInputStream& ); // never implemented
+ StorageXMLInputStream& operator=( const StorageXMLInputStream& ); // never implemented
+
+ private:
+ ::std::auto_ptr< StorageXMLInputStream_Data > m_pData;
+ };
+
//........................................................................
} // namespace dbaccess
//........................................................................
diff --git a/dbaccess/source/core/recovery/subcomponentrecovery.cxx b/dbaccess/source/core/recovery/subcomponentrecovery.cxx
index 2331b70d42cc..4551c83083ee 100644
--- a/dbaccess/source/core/recovery/subcomponentrecovery.cxx
+++ b/dbaccess/source/core/recovery/subcomponentrecovery.cxx
@@ -30,6 +30,7 @@
#include "sdbcoretools.hxx"
#include "storagexmlstream.hxx"
#include "subcomponentloader.hxx"
+#include "settingsimport.hxx"
/** === begin UNO includes === **/
#include <com/sun/star/embed/ElementModes.hpp>
@@ -39,6 +40,7 @@
#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
#include <com/sun/star/sdb/XFormDocumentsSupplier.hpp>
#include <com/sun/star/sdb/XReportDocumentsSupplier.hpp>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
/** === end UNO includes === **/
#include <comphelper/namedvaluecollection.hxx>
@@ -79,6 +81,10 @@ namespace dbaccess
using ::com::sun::star::container::XHierarchicalNameAccess;
using ::com::sun::star::sdb::XFormDocumentsSupplier;
using ::com::sun::star::sdb::XReportDocumentsSupplier;
+ using ::com::sun::star::xml::sax::SAXException;
+ using ::com::sun::star::xml::sax::XLocator;
+ using ::com::sun::star::xml::sax::XDocumentHandler;
+ using ::com::sun::star::xml::sax::XAttributeList;
/** === end UNO using === **/
namespace ElementModes = ::com::sun::star::embed::ElementModes;
@@ -276,6 +282,125 @@ namespace dbaccess
return m_rContext.getLegacyServiceFactory();
}
+ //==================================================================================================================
+ //= SettingsDocumentHandler
+ //==================================================================================================================
+ typedef ::cppu::WeakImplHelper1 < XDocumentHandler
+ > SettingsDocumentHandler_Base;
+ class DBACCESS_DLLPRIVATE SettingsDocumentHandler : public SettingsDocumentHandler_Base
+ {
+ public:
+ SettingsDocumentHandler()
+ {
+ }
+
+ protected:
+ virtual ~SettingsDocumentHandler()
+ {
+ }
+
+ public:
+ // XDocumentHandler
+ virtual void SAL_CALL startDocument( ) throw (SAXException, RuntimeException);
+ virtual void SAL_CALL endDocument( ) throw (SAXException, RuntimeException);
+ virtual void SAL_CALL startElement( const ::rtl::OUString& aName, const Reference< XAttributeList >& xAttribs ) throw (SAXException, RuntimeException);
+ virtual void SAL_CALL endElement( const ::rtl::OUString& aName ) throw (SAXException, RuntimeException);
+ virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (SAXException, RuntimeException);
+ virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw (SAXException, RuntimeException);
+ virtual void SAL_CALL processingInstruction( const ::rtl::OUString& aTarget, const ::rtl::OUString& aData ) throw (SAXException, RuntimeException);
+ virtual void SAL_CALL setDocumentLocator( const Reference< XLocator >& xLocator ) throw (SAXException, RuntimeException);
+
+ const ::comphelper::NamedValueCollection& getSettings() const { return m_aSettings; }
+
+ private:
+ ::std::stack< ::rtl::Reference< SettingsImport > > m_aStates;
+ ::comphelper::NamedValueCollection m_aSettings;
+ };
+
+ //--------------------------------------------------------------------
+ void SAL_CALL SettingsDocumentHandler::startDocument( ) throw (SAXException, RuntimeException)
+ {
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL SettingsDocumentHandler::endDocument( ) throw (SAXException, RuntimeException)
+ {
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL SettingsDocumentHandler::startElement( const ::rtl::OUString& i_Name, const Reference< XAttributeList >& i_Attribs ) throw (SAXException, RuntimeException)
+ {
+ ::rtl::Reference< SettingsImport > pNewState;
+
+ if ( m_aStates.empty() )
+ {
+ if ( i_Name.equalsAscii( "office:settings" ) )
+ {
+ pNewState = new OfficeSettingsImport( m_aSettings );
+ }
+ else
+ {
+ OSL_ENSURE( false, "SettingsDocumentHandler::startElement: invalid settings file!" );
+ // Yes, that's not correct. Somebody could, in theory, give us a document which starts with "foo:settings",
+ // where "foo" is mapped to the proper namespace URL.
+ // However, there's no need to bother with this. The "recovery" sub storage we're recovering from is
+ // not part of ODF, so we can impose any format restrictions on it ...
+ }
+ }
+ else
+ {
+ ::rtl::Reference< SettingsImport > pCurrentState( m_aStates.top() );
+ pNewState = pCurrentState->nextState( i_Name );
+ }
+
+ ENSURE_OR_THROW( pNewState.is(), "no new state - aborting import" );
+ pNewState->startElement( i_Attribs );
+
+ m_aStates.push( pNewState );
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL SettingsDocumentHandler::endElement( const ::rtl::OUString& i_Name ) throw (SAXException, RuntimeException)
+ {
+ ENSURE_OR_THROW( !m_aStates.empty(), "no active element" );
+ (void)i_Name;
+
+ ::rtl::Reference< SettingsImport > pCurrentState( m_aStates.top() );
+ pCurrentState->endElement();
+ m_aStates.pop();
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL SettingsDocumentHandler::characters( const ::rtl::OUString& i_Chars ) throw (SAXException, RuntimeException)
+ {
+ ENSURE_OR_THROW( !m_aStates.empty(), "no active element" );
+
+ ::rtl::Reference< SettingsImport > pCurrentState( m_aStates.top() );
+ pCurrentState->characters( i_Chars );
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL SettingsDocumentHandler::ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw (SAXException, RuntimeException)
+ {
+ // ignore them - that's why they're called "ignorable"
+ (void)aWhitespaces;
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL SettingsDocumentHandler::processingInstruction( const ::rtl::OUString& i_Target, const ::rtl::OUString& i_Data ) throw (SAXException, RuntimeException)
+ {
+ OSL_ENSURE( false, "SettingsDocumentHandler::processingInstruction: unexpected ..." );
+ (void)i_Target;
+ (void)i_Data;
+ }
+
+ //--------------------------------------------------------------------
+ void SAL_CALL SettingsDocumentHandler::setDocumentLocator( const Reference< XLocator >& i_Locator ) throw (SAXException, RuntimeException)
+ {
+ // TODO: place your code here
+ (void)i_Locator;
+ }
+
//====================================================================
//= SubComponentRecovery
//====================================================================
@@ -499,6 +624,27 @@ namespace dbaccess
}
//--------------------------------------------------------------------
+ Reference< XComponent > SubComponentRecovery::impl_recoverQueryDesign_throw( const Reference< XStorage >& i_rRecoveryStorage,
+ const ::rtl::OUString& i_rComponentName, const bool i_bForEditing )
+ {
+ Reference< XComponent > xSubComponent;
+
+ // first read the settings query design settings from the storage
+ StorageXMLInputStream aDesignInput( m_rContext, i_rRecoveryStorage, lcl_getSettingsStreamName() );
+
+ ::rtl::Reference< SettingsDocumentHandler > pDocHandler( new SettingsDocumentHandler );
+ aDesignInput.import( pDocHandler.get() );
+
+ const ::comphelper::NamedValueCollection& rSettings( pDocHandler->getSettings() );
+
+ // TODO
+ (void)i_rComponentName;
+ (void)i_bForEditing;
+
+ return xSubComponent;
+ }
+
+ //--------------------------------------------------------------------
Reference< XComponent > SubComponentRecovery::recoverFromStorage( const Reference< XStorage >& i_rRecoveryStorage,
const ::rtl::OUString& i_rComponentName, const bool i_bForEditing )
{
@@ -510,7 +656,8 @@ namespace dbaccess
xSubComponent = impl_recoverSubDocument_throw( i_rRecoveryStorage, i_rComponentName, i_bForEditing );
break;
case QUERY:
- // TODO
+ xSubComponent = impl_recoverQueryDesign_throw( i_rRecoveryStorage, i_rComponentName, i_bForEditing );
+ break;
default:
OSL_ENSURE( false, "SubComponentRecovery::recoverFromStorage: unimplemented case!" );
break;
diff --git a/dbaccess/source/core/recovery/subcomponentrecovery.hxx b/dbaccess/source/core/recovery/subcomponentrecovery.hxx
index 59a67d802faa..2cec262937a8 100644
--- a/dbaccess/source/core/recovery/subcomponentrecovery.hxx
+++ b/dbaccess/source/core/recovery/subcomponentrecovery.hxx
@@ -99,6 +99,13 @@ namespace dbaccess
const bool i_bForEditing
);
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >
+ impl_recoverQueryDesign_throw(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& i_rRecoveryStorage,
+ const ::rtl::OUString& i_rComponentName,
+ const bool i_bForEditing
+ );
+
void impl_identifyComponent_throw();
private: