diff --git a/comphelper/inc/comphelper/storagehelper.hxx b/comphelper/inc/comphelper/storagehelper.hxx index c0aa735c8390..36ff7957f4bc 100644 --- a/comphelper/inc/comphelper/storagehelper.hxx +++ b/comphelper/inc/comphelper/storagehelper.hxx @@ -25,8 +25,10 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef _COMPHELPER_STORAGEHELPER_HXX -#define _COMPHELPER_STORAGEHELPER_HXX +#ifndef COMPHELPER_STORAGEHELPER_HXX +#define COMPHELPER_STORAGEHELPER_HXX + +#include #include #include @@ -51,6 +53,20 @@ namespace comphelper { +// Unfortunately - the impl.s of XStorage like to invalidate all +// their sub streams and storages when you release references, so +// it is necessary to keep references to all storages down the +// path - this is 'beautiful' (TM). So we need this ugly hack: +class COMPHELPER_DLLPUBLIC LifecycleProxy +{ +private: + class Impl; +public: + ::boost::scoped_ptr m_pBadness; + LifecycleProxy(); + ~LifecycleProxy(); +}; + class COMPHELPER_DLLPUBLIC OStorageHelper { public: @@ -170,17 +186,6 @@ public: // Methods to allow easy use of hierachical names inside storages - // Unfortunately - the impl.s of XStorage like to invalidate all - // their sub streams and storages when you release references, so - // it is necessary to keep references to all storages down the - // path - this is 'beautiful' (TM). So we need this ugly hack: - class LifecycleProxyImpl; - class COMPHELPER_DLLPUBLIC LifecycleProxy { - public: - LifecycleProxyImpl *pBadness; - LifecycleProxy(); - ~LifecycleProxy(); - }; static ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > GetStorageAtPath( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > &xStorage, const ::rtl::OUString& aPath, sal_uInt32 nOpenMode, LifecycleProxy &rNastiness ); diff --git a/comphelper/source/misc/storagehelper.cxx b/comphelper/source/misc/storagehelper.cxx index 6fb41c9cedb9..e429f2223069 100644 --- a/comphelper/source/misc/storagehelper.cxx +++ b/comphelper/source/misc/storagehelper.cxx @@ -545,10 +545,11 @@ sal_Bool OStorageHelper::PathHasSegment( const ::rtl::OUString& aPath, const ::r return bResult; } -class OStorageHelper::LifecycleProxyImpl : public std::vector< uno::Reference< embed::XStorage > > {}; -OStorageHelper::LifecycleProxy::LifecycleProxy() : - pBadness( new OStorageHelper::LifecycleProxyImpl() ) { } -OStorageHelper::LifecycleProxy::~LifecycleProxy() { delete pBadness; } +class LifecycleProxy::Impl + : public std::vector< uno::Reference< embed::XStorage > > {}; +LifecycleProxy::LifecycleProxy() + : m_pBadness( new Impl() ) { } +LifecycleProxy::~LifecycleProxy() { } static void splitPath( std::vector &rElems, const ::rtl::OUString& rPath ) @@ -560,14 +561,14 @@ static void splitPath( std::vector &rElems, static uno::Reference< embed::XStorage > LookupStorageAtPath( const uno::Reference< embed::XStorage > &xParentStorage, std::vector &rElems, sal_uInt32 nOpenMode, - OStorageHelper::LifecycleProxy &rNastiness ) + LifecycleProxy &rNastiness ) { uno::Reference< embed::XStorage > xStorage( xParentStorage ); - rNastiness.pBadness->push_back( xStorage ); + rNastiness.m_pBadness->push_back( xStorage ); for( size_t i = 0; i < rElems.size() && xStorage.is(); i++ ) { xStorage = xStorage->openStorageElement( rElems[i], nOpenMode ); - rNastiness.pBadness->push_back( xStorage ); + rNastiness.m_pBadness->push_back( xStorage ); } return xStorage; } @@ -575,7 +576,7 @@ static uno::Reference< embed::XStorage > LookupStorageAtPath( uno::Reference< embed::XStorage > OStorageHelper::GetStorageAtPath( const uno::Reference< embed::XStorage > &xStorage, const ::rtl::OUString& rPath, sal_uInt32 nOpenMode, - OStorageHelper::LifecycleProxy &rNastiness ) + LifecycleProxy &rNastiness ) { std::vector aElems; splitPath( aElems, rPath ); @@ -585,7 +586,7 @@ uno::Reference< embed::XStorage > OStorageHelper::GetStorageAtPath( uno::Reference< io::XStream > OStorageHelper::GetStreamAtPath( const uno::Reference< embed::XStorage > &xParentStorage, const ::rtl::OUString& rPath, sal_uInt32 nOpenMode, - OStorageHelper::LifecycleProxy &rNastiness ) + LifecycleProxy &rNastiness ) { std::vector aElems; splitPath( aElems, rPath ); @@ -601,7 +602,7 @@ uno::Reference< io::XStream > OStorageHelper::GetStreamAtPath( uno::Reference< io::XStream > OStorageHelper::GetStreamAtPackageURL( uno::Reference< embed::XStorage > const& xParentStorage, const ::rtl::OUString& rURL, sal_uInt32 const nOpenMode, - OStorageHelper::LifecycleProxy & rNastiness) + LifecycleProxy & rNastiness) { static char const s_PkgScheme[] = "vnd.sun.star.Package:"; if (0 == rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( diff --git a/svx/source/xml/xmlxtimp.cxx b/svx/source/xml/xmlxtimp.cxx index 604c6fb7d82c..50106c15fcbe 100644 --- a/svx/source/xml/xmlxtimp.cxx +++ b/svx/source/xml/xmlxtimp.cxx @@ -403,7 +403,7 @@ bool SvxXMLXTableImport::load( const rtl::OUString &rPath, uno::Reference< xml::sax::XParser > xParser( xServiceFactory->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Parser" ) ) ), uno::UNO_QUERY_THROW ); xml::sax::InputSource aParserInput; - comphelper::OStorageHelper::LifecycleProxy aNasty; + comphelper::LifecycleProxy aNasty; if( !bUseStorage || !xStorage.is() ) {