22#include <com/sun/star/io/IOException.hpp>
23#include <com/sun/star/uno/Reference.hxx>
24#include <com/sun/star/embed/ElementModes.hpp>
25#include <com/sun/star/embed/XHierarchicalStorageAccess2.hpp>
26#include <com/sun/star/embed/XTransactedObject.hpp>
27#include <com/sun/star/embed/XTransactionBroadcaster.hpp>
28#include <com/sun/star/lang/IllegalArgumentException.hpp>
29#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
41 uno::Reference< embed::XStorage > xOwnStor(
m_xWeakOwnStorage.get(), uno::UNO_QUERY_THROW );
43 if ( !( nStorageMode & embed::ElementModes::WRITE ) && ( nStreamMode & embed::ElementModes::WRITE ) )
44 throw io::IOException(
"invalid storage/stream mode combo");
46 uno::Reference< embed::XExtendedStorageStream > xResult =
47 m_xChild->GetStreamHierarchically( nStorageMode, aListPath, nStreamMode, aEncryptionData );
49 throw uno::RuntimeException();
56 uno::Reference< embed::XStorage > xOwnStor(
m_xWeakOwnStorage.get(), uno::UNO_QUERY_THROW );
58 m_xChild->RemoveStreamHierarchically( aListPath );
64 std::vector<OUString> aResult;
69 if (
aName.isEmpty() )
70 throw lang::IllegalArgumentException();
72 aResult.push_back(
aName );
85 if ( !( nStorageMode & embed::ElementModes::WRITE ) && ( nStreamMode & embed::ElementModes::WRITE ) )
86 throw io::IOException(
"invalid storage/stream mode combo");
88 if ( aListPath.empty() )
89 throw uno::RuntimeException();
91 OUString aNextName = *(aListPath.begin());
92 aListPath.erase( aListPath.begin() );
94 uno::Reference< embed::XExtendedStorageStream > xResult;
97 : uno::Reference< embed::XStorage >(
m_xWeakOwnStorage.get(), uno::UNO_QUERY_THROW );
99 if ( aListPath.empty() )
101 if ( aEncryptionData.empty() )
103 uno::Reference< embed::XHierarchicalStorageAccess > xHStorage( xOwnStor, uno::UNO_QUERY_THROW );
104 xResult = xHStorage->openStreamElementByHierarchicalName( aNextName, nStreamMode );
108 uno::Reference< embed::XHierarchicalStorageAccess2 > xHStorage( xOwnStor, uno::UNO_QUERY_THROW );
109 xResult = xHStorage->openEncryptedStreamByHierarchicalName( aNextName, nStreamMode, aEncryptionData.getAsConstNamedValueList() );
112 uno::Reference< embed::XTransactedObject > xTransact( xResult, uno::UNO_QUERY );
113 if ( xTransact.is() )
117 uno::Reference< embed::XTransactionBroadcaster > xTrBroadcast( xTransact, uno::UNO_QUERY_THROW );
118 xTrBroadcast->addTransactionListener(
static_cast< embed::XTransactionListener*
>(
this ) );
122 uno::Reference< lang::XComponent > xStreamComp( xResult, uno::UNO_QUERY_THROW );
123 xStreamComp->addEventListener(
static_cast< lang::XEventListener*
>(
this ) );
130 bool bNewElement =
false;
132 OHierarchyElementList_Impl::iterator aIter =
m_aChildren.find( aNextName );
134 aElement = aIter->second;
136 if ( !aElement.is() )
139 uno::Reference< embed::XStorage > xChildStorage = xOwnStor->openStorageElement( aNextName, nStorageMode );
140 if ( !xChildStorage.is() )
141 throw uno::RuntimeException();
146 xResult = aElement->GetStreamHierarchically( nStorageMode, aListPath, nStreamMode, aEncryptionData );
148 throw uno::RuntimeException();
153 aElement->SetParent(
this );
165 std::unique_lock aGuard(
m_aMutex );
167 if ( aListPath.empty() )
168 throw uno::RuntimeException();
170 OUString aNextName = *(aListPath.begin());
171 aListPath.erase( aListPath.begin() );
174 : uno::Reference< embed::XStorage >(
m_xWeakOwnStorage.get(), uno::UNO_QUERY_THROW );
176 if ( aListPath.empty() )
178 xOwnStor->removeElement( aNextName );
183 OHierarchyElementList_Impl::iterator aIter =
m_aChildren.find( aNextName );
185 aElement = aIter->second;
187 if ( !aElement.is() )
189 uno::Reference< embed::XStorage > xChildStorage = xOwnStor->openStorageElement( aNextName,
190 embed::ElementModes::READWRITE );
191 if ( !xChildStorage.is() )
192 throw uno::RuntimeException();
197 aElement->RemoveStreamHierarchically( aListPath );
200 uno::Reference< embed::XTransactedObject > xTransact( xOwnStor, uno::UNO_QUERY );
201 if ( xTransact.is() )
211 uno::Reference< embed::XStorage > xOwnStor;
214 std::unique_lock aGuard(
m_aMutex );
221 uno::Reference< embed::XTransactedObject > xTransact( xOwnStor, uno::UNO_QUERY_THROW );
232 std::unique_lock aGuard(
m_aMutex );
245 catch( uno::Exception& )
263 uno::Reference< embed::XExtendedStorageStream >
xStream(
Source.Source, uno::UNO_QUERY);
266 [&
xStream](
const OWeakStorRefVector_Impl::value_type& rxStorage) {
267 return !rxStorage.get().is() || rxStorage.get() == xStream; }),
273 catch( uno::Exception&
ex )
276 throw lang::WrappedTargetRuntimeException(
ex.Message,
284 std::unique_lock aGuard(
m_aMutex );
285 OHierarchyElementList_Impl::iterator aIter =
m_aChildren.begin();
288 if (aIter->second == aRef )
309 catch(
const uno::Exception& )
312 throw lang::WrappedTargetRuntimeException(
313 "Can not commit storage sequence!",
314 uno::Reference< uno::XInterface >(),
OHierarchyElement_Impl(css::uno::Reference< css::embed::XStorage > xStorage)
virtual void SAL_CALL preCommit(const css::lang::EventObject &aEvent) override
OWeakStorRefVector_Impl m_aOpenStreams
css::uno::WeakReference< css::embed::XStorage > m_xWeakOwnStorage
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
::rtl::Reference< OHierarchyElement_Impl > m_rParent
OHierarchyElementList_Impl m_aChildren
css::uno::Reference< css::embed::XStorage > m_xOwnStorage
css::uno::Reference< css::embed::XExtendedStorageStream > GetStreamHierarchically(sal_Int32 nStorageMode, std::vector< OUString > &aPath, sal_Int32 nStreamMode, const ::comphelper::SequenceAsHashMap &aEncryptionData)
virtual void SAL_CALL preRevert(const css::lang::EventObject &aEvent) override
virtual void SAL_CALL reverted(const css::lang::EventObject &aEvent) override
virtual void SAL_CALL commited(const css::lang::EventObject &aEvent) override
void RemoveElement(const ::rtl::Reference< OHierarchyElement_Impl > &aRef)
void RemoveStreamHierarchically(std::vector< OUString > &aListPath)
css::uno::WeakReference< css::embed::XStorage > m_xWeakOwnStorage
css::uno::Reference< css::embed::XExtendedStorageStream > GetStreamHierarchically(sal_Int32 nStorageMode, std::vector< OUString > &aListPath, sal_Int32 nStreamMode, const ::comphelper::SequenceAsHashMap &aEncryptionData=::comphelper::SequenceAsHashMap())
void RemoveStreamHierarchically(std::vector< OUString > &aListPath)
static std::vector< OUString > GetListPathFromString(std::u16string_view aPath)
::rtl::Reference< OHierarchyElement_Impl > m_xChild
Any SAL_CALL getCaughtException()
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)