1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_package.hxx"
26*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.hxx>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/ElementModes.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XHierarchicalStorageAccess2.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include "ohierarchyholder.hxx"
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski //===============================================
36*b1cdbd2cSJim Jagielski // OHierarchyHolder_Impl
37*b1cdbd2cSJim Jagielski //===============================================
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski //-----------------------------------------------
GetStreamHierarchically(sal_Int32 nStorageMode,OStringList_Impl & aListPath,sal_Int32 nStreamMode,const::comphelper::SequenceAsHashMap & aEncryptionData)40*b1cdbd2cSJim Jagielski uno::Reference< embed::XExtendedStorageStream > OHierarchyHolder_Impl::GetStreamHierarchically( sal_Int32 nStorageMode, OStringList_Impl& aListPath, sal_Int32 nStreamMode, const ::comphelper::SequenceAsHashMap& aEncryptionData )
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XStorage > xOwnStor( m_xWeakOwnStorage.get(), uno::UNO_QUERY_THROW );
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski 	if ( !( nStorageMode & embed::ElementModes::WRITE ) && ( nStreamMode & embed::ElementModes::WRITE ) )
45*b1cdbd2cSJim Jagielski 		throw io::IOException();
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XExtendedStorageStream > xResult =
48*b1cdbd2cSJim Jagielski 		m_xChild->GetStreamHierarchically( nStorageMode, aListPath, nStreamMode, aEncryptionData );
49*b1cdbd2cSJim Jagielski 	if ( !xResult.is() )
50*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException();
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski 	return xResult;
53*b1cdbd2cSJim Jagielski }
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski //-----------------------------------------------
RemoveStreamHierarchically(OStringList_Impl & aListPath)56*b1cdbd2cSJim Jagielski void OHierarchyHolder_Impl::RemoveStreamHierarchically( OStringList_Impl& aListPath )
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XStorage > xOwnStor( m_xWeakOwnStorage.get(), uno::UNO_QUERY_THROW );
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski 	m_xChild->RemoveStreamHierarchically( aListPath );
61*b1cdbd2cSJim Jagielski }
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski //-----------------------------------------------
64*b1cdbd2cSJim Jagielski // static
GetListPathFromString(const::rtl::OUString & aPath)65*b1cdbd2cSJim Jagielski OStringList_Impl OHierarchyHolder_Impl::GetListPathFromString( const ::rtl::OUString& aPath )
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski 	OStringList_Impl aResult;
68*b1cdbd2cSJim Jagielski 	sal_Int32 nIndex = 0;
69*b1cdbd2cSJim Jagielski 	do
70*b1cdbd2cSJim Jagielski 	{
71*b1cdbd2cSJim Jagielski 		::rtl::OUString aName = aPath.getToken( 0, '/', nIndex );
72*b1cdbd2cSJim Jagielski 		if ( !aName.getLength() )
73*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException();
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski 		aResult.push_back( aName );
76*b1cdbd2cSJim Jagielski 	}
77*b1cdbd2cSJim Jagielski 	while ( nIndex >= 0 );
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 	return aResult;
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski //===============================================
83*b1cdbd2cSJim Jagielski // OHierarchyElement_Impl
84*b1cdbd2cSJim Jagielski //===============================================
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski //-----------------------------------------------
GetStreamHierarchically(sal_Int32 nStorageMode,OStringList_Impl & aListPath,sal_Int32 nStreamMode,const::comphelper::SequenceAsHashMap & aEncryptionData)87*b1cdbd2cSJim Jagielski uno::Reference< embed::XExtendedStorageStream > OHierarchyElement_Impl::GetStreamHierarchically( sal_Int32 nStorageMode, OStringList_Impl& aListPath, sal_Int32 nStreamMode, const ::comphelper::SequenceAsHashMap& aEncryptionData )
88*b1cdbd2cSJim Jagielski {
89*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	if ( !( nStorageMode & embed::ElementModes::WRITE ) && ( nStreamMode & embed::ElementModes::WRITE ) )
92*b1cdbd2cSJim Jagielski 		throw io::IOException();
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 	if ( !aListPath.size() )
95*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException();
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 	::rtl::OUString aNextName = *(aListPath.begin());
98*b1cdbd2cSJim Jagielski 	aListPath.erase( aListPath.begin() );
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XExtendedStorageStream > xResult;
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XStorage > xOwnStor = m_xOwnStorage.is() ? m_xOwnStorage
103*b1cdbd2cSJim Jagielski 				: uno::Reference< embed::XStorage >( m_xWeakOwnStorage.get(), uno::UNO_QUERY );
104*b1cdbd2cSJim Jagielski 	if ( !xOwnStor.is() )
105*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException();
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 	if ( !aListPath.size() )
108*b1cdbd2cSJim Jagielski 	{
109*b1cdbd2cSJim Jagielski 		if ( !aEncryptionData.size() )
110*b1cdbd2cSJim Jagielski         {
111*b1cdbd2cSJim Jagielski             uno::Reference< embed::XHierarchicalStorageAccess > xHStorage( xOwnStor, uno::UNO_QUERY_THROW );
112*b1cdbd2cSJim Jagielski 			xResult = xHStorage->openStreamElementByHierarchicalName( aNextName, nStreamMode );
113*b1cdbd2cSJim Jagielski         }
114*b1cdbd2cSJim Jagielski 		else
115*b1cdbd2cSJim Jagielski         {
116*b1cdbd2cSJim Jagielski             uno::Reference< embed::XHierarchicalStorageAccess2 > xHStorage( xOwnStor, uno::UNO_QUERY_THROW );
117*b1cdbd2cSJim Jagielski 			xResult = xHStorage->openEncryptedStreamByHierarchicalName( aNextName, nStreamMode, aEncryptionData.getAsConstNamedValueList() );
118*b1cdbd2cSJim Jagielski         }
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 		uno::Reference< embed::XTransactedObject > xTransact( xResult, uno::UNO_QUERY );
121*b1cdbd2cSJim Jagielski 		if ( xTransact.is() )
122*b1cdbd2cSJim Jagielski 		{
123*b1cdbd2cSJim Jagielski 			// the existance of the transacted object means that the stream is opened for writing also
124*b1cdbd2cSJim Jagielski 			// so the whole chain must be commited
125*b1cdbd2cSJim Jagielski 			uno::Reference< embed::XTransactionBroadcaster > xTrBroadcast( xTransact, uno::UNO_QUERY_THROW );
126*b1cdbd2cSJim Jagielski 			xTrBroadcast->addTransactionListener( static_cast< embed::XTransactionListener* >( this ) );
127*b1cdbd2cSJim Jagielski 		}
128*b1cdbd2cSJim Jagielski 		else
129*b1cdbd2cSJim Jagielski 		{
130*b1cdbd2cSJim Jagielski 			uno::Reference< lang::XComponent > xStreamComp( xResult, uno::UNO_QUERY_THROW );
131*b1cdbd2cSJim Jagielski 			xStreamComp->addEventListener( static_cast< lang::XEventListener* >( this ) );
132*b1cdbd2cSJim Jagielski 		}
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 		m_aOpenStreams.push_back( uno::WeakReference< embed::XExtendedStorageStream >( xResult ) );
135*b1cdbd2cSJim Jagielski 	}
136*b1cdbd2cSJim Jagielski 	else
137*b1cdbd2cSJim Jagielski 	{
138*b1cdbd2cSJim Jagielski 		sal_Bool bNewElement = sal_False;
139*b1cdbd2cSJim Jagielski 		::rtl::Reference< OHierarchyElement_Impl > aElement;
140*b1cdbd2cSJim Jagielski 		OHierarchyElementList_Impl::iterator aIter = m_aChildren.find( aNextName );
141*b1cdbd2cSJim Jagielski 		if ( aIter != m_aChildren.end() )
142*b1cdbd2cSJim Jagielski 			aElement = aIter->second;
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski 		if ( !aElement.is() )
145*b1cdbd2cSJim Jagielski 		{
146*b1cdbd2cSJim Jagielski 			bNewElement = sal_True;
147*b1cdbd2cSJim Jagielski 			uno::Reference< embed::XStorage > xChildStorage = xOwnStor->openStorageElement( aNextName, nStorageMode );
148*b1cdbd2cSJim Jagielski 			if ( !xChildStorage.is() )
149*b1cdbd2cSJim Jagielski 				throw uno::RuntimeException();
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 			aElement = new OHierarchyElement_Impl( NULL, xChildStorage );
152*b1cdbd2cSJim Jagielski 		}
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 		xResult = aElement->GetStreamHierarchically( nStorageMode, aListPath, nStreamMode, aEncryptionData );
155*b1cdbd2cSJim Jagielski 		if ( !xResult.is() )
156*b1cdbd2cSJim Jagielski 			throw uno::RuntimeException();
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 		if ( bNewElement )
159*b1cdbd2cSJim Jagielski 		{
160*b1cdbd2cSJim Jagielski 			m_aChildren[aNextName] = aElement;
161*b1cdbd2cSJim Jagielski 			aElement->SetParent( this );
162*b1cdbd2cSJim Jagielski 		}
163*b1cdbd2cSJim Jagielski 	}
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 	// the subelement was opened successfuly, remember the storage to let it be locked
166*b1cdbd2cSJim Jagielski 	m_xOwnStorage = xOwnStor;
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 	return xResult;
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski //-----------------------------------------------
RemoveStreamHierarchically(OStringList_Impl & aListPath)172*b1cdbd2cSJim Jagielski void OHierarchyElement_Impl::RemoveStreamHierarchically( OStringList_Impl& aListPath )
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 	if ( !aListPath.size() )
177*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException();
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 	::rtl::OUString aNextName = *(aListPath.begin());
180*b1cdbd2cSJim Jagielski 	aListPath.erase( aListPath.begin() );
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XExtendedStorageStream > xResult;
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XStorage > xOwnStor = m_xOwnStorage.is() ? m_xOwnStorage
185*b1cdbd2cSJim Jagielski 				: uno::Reference< embed::XStorage >( m_xWeakOwnStorage.get(), uno::UNO_QUERY );
186*b1cdbd2cSJim Jagielski 	if ( !xOwnStor.is() )
187*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException();
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 	if ( !aListPath.size() )
190*b1cdbd2cSJim Jagielski 	{
191*b1cdbd2cSJim Jagielski 		xOwnStor->removeElement( aNextName );
192*b1cdbd2cSJim Jagielski 	}
193*b1cdbd2cSJim Jagielski 	else
194*b1cdbd2cSJim Jagielski 	{
195*b1cdbd2cSJim Jagielski 		sal_Bool bNewElement = sal_False;
196*b1cdbd2cSJim Jagielski 		::rtl::Reference< OHierarchyElement_Impl > aElement;
197*b1cdbd2cSJim Jagielski 		OHierarchyElementList_Impl::iterator aIter = m_aChildren.find( aNextName );
198*b1cdbd2cSJim Jagielski 		if ( aIter != m_aChildren.end() )
199*b1cdbd2cSJim Jagielski 			aElement = aIter->second;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 		if ( !aElement.is() )
202*b1cdbd2cSJim Jagielski 		{
203*b1cdbd2cSJim Jagielski 			bNewElement = sal_True;
204*b1cdbd2cSJim Jagielski 			uno::Reference< embed::XStorage > xChildStorage = xOwnStor->openStorageElement( aNextName,
205*b1cdbd2cSJim Jagielski 																							embed::ElementModes::READWRITE );
206*b1cdbd2cSJim Jagielski 			if ( !xChildStorage.is() )
207*b1cdbd2cSJim Jagielski 				throw uno::RuntimeException();
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 			aElement = new OHierarchyElement_Impl( NULL, xChildStorage );
210*b1cdbd2cSJim Jagielski 		}
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 		aElement->RemoveStreamHierarchically( aListPath );
213*b1cdbd2cSJim Jagielski 	}
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XTransactedObject > xTransact( xOwnStor, uno::UNO_QUERY );
216*b1cdbd2cSJim Jagielski 	if ( xTransact.is() )
217*b1cdbd2cSJim Jagielski 		xTransact->commit();
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 	TestForClosing();
220*b1cdbd2cSJim Jagielski }
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski //-----------------------------------------------
Commit()223*b1cdbd2cSJim Jagielski void OHierarchyElement_Impl::Commit()
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski 	::rtl::Reference< OHierarchyElement_Impl > aLocker( this );
226*b1cdbd2cSJim Jagielski 	::rtl::Reference< OHierarchyElement_Impl > aParent;
227*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XStorage > xOwnStor;
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 	{
230*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( m_aMutex );
231*b1cdbd2cSJim Jagielski 		aParent = m_rParent;
232*b1cdbd2cSJim Jagielski 		xOwnStor = m_xOwnStorage;
233*b1cdbd2cSJim Jagielski 	}
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski 	if ( xOwnStor.is() )
236*b1cdbd2cSJim Jagielski 	{
237*b1cdbd2cSJim Jagielski 		uno::Reference< embed::XTransactedObject > xTransact( xOwnStor, uno::UNO_QUERY_THROW );
238*b1cdbd2cSJim Jagielski 		xTransact->commit();
239*b1cdbd2cSJim Jagielski 		if ( aParent.is() )
240*b1cdbd2cSJim Jagielski 			aParent->Commit();
241*b1cdbd2cSJim Jagielski 	}
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski //-----------------------------------------------
TestForClosing()245*b1cdbd2cSJim Jagielski void OHierarchyElement_Impl::TestForClosing()
246*b1cdbd2cSJim Jagielski {
247*b1cdbd2cSJim Jagielski 	::rtl::Reference< OHierarchyElement_Impl > aLocker( this );
248*b1cdbd2cSJim Jagielski 	{
249*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( m_aMutex );
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski 		if ( !m_aOpenStreams.size() && !m_aChildren.size() )
252*b1cdbd2cSJim Jagielski 		{
253*b1cdbd2cSJim Jagielski 			if ( m_rParent.is() )
254*b1cdbd2cSJim Jagielski 			{
255*b1cdbd2cSJim Jagielski 				// only the root storage should not be disposed, other storages can be disposed
256*b1cdbd2cSJim Jagielski 				if ( m_xOwnStorage.is() )
257*b1cdbd2cSJim Jagielski 				{
258*b1cdbd2cSJim Jagielski 					try
259*b1cdbd2cSJim Jagielski 					{
260*b1cdbd2cSJim Jagielski 						m_xOwnStorage->dispose();
261*b1cdbd2cSJim Jagielski 					}
262*b1cdbd2cSJim Jagielski 					catch( uno::Exception& )
263*b1cdbd2cSJim Jagielski 					{}
264*b1cdbd2cSJim Jagielski 				}
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 				m_rParent->RemoveElement( this );
267*b1cdbd2cSJim Jagielski 			}
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 			m_xOwnStorage = uno::Reference< embed::XStorage >();
270*b1cdbd2cSJim Jagielski 		}
271*b1cdbd2cSJim Jagielski 	}
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski //-----------------------------------------------
disposing(const lang::EventObject & Source)275*b1cdbd2cSJim Jagielski void SAL_CALL OHierarchyElement_Impl::disposing( const lang::EventObject& Source )
276*b1cdbd2cSJim Jagielski 		throw ( uno::RuntimeException )
277*b1cdbd2cSJim Jagielski {
278*b1cdbd2cSJim Jagielski 	uno::Sequence< embed::XStorage > aStoragesToCommit;
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 	try
281*b1cdbd2cSJim Jagielski 	{
282*b1cdbd2cSJim Jagielski 		::osl::ClearableMutexGuard aGuard( m_aMutex );
283*b1cdbd2cSJim Jagielski 		uno::Reference< embed::XExtendedStorageStream > xStream( Source.Source, uno::UNO_QUERY );
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 		for ( OWeakStorRefList_Impl::iterator pStorageIter = m_aOpenStreams.begin();
286*b1cdbd2cSJim Jagielski 			  pStorageIter != m_aOpenStreams.end(); )
287*b1cdbd2cSJim Jagielski 		{
288*b1cdbd2cSJim Jagielski 			OWeakStorRefList_Impl::iterator pTmp = pStorageIter++;
289*b1cdbd2cSJim Jagielski 			if ( !pTmp->get().is() || pTmp->get() == xStream )
290*b1cdbd2cSJim Jagielski 				m_aOpenStreams.erase( pTmp );
291*b1cdbd2cSJim Jagielski 		}
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 		aGuard.clear();
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski 		TestForClosing();
296*b1cdbd2cSJim Jagielski 	}
297*b1cdbd2cSJim Jagielski 	catch( uno::Exception& )
298*b1cdbd2cSJim Jagielski 	{
299*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException(); // no exception must happen here, usually an exception means disaster
300*b1cdbd2cSJim Jagielski 	}
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski //-----------------------------------------------
RemoveElement(const::rtl::Reference<OHierarchyElement_Impl> & aRef)304*b1cdbd2cSJim Jagielski void OHierarchyElement_Impl::RemoveElement( const ::rtl::Reference< OHierarchyElement_Impl >& aRef )
305*b1cdbd2cSJim Jagielski {
306*b1cdbd2cSJim Jagielski 	{
307*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( m_aMutex );
308*b1cdbd2cSJim Jagielski 		for ( OHierarchyElementList_Impl::iterator aIter = m_aChildren.begin();
309*b1cdbd2cSJim Jagielski 			  aIter != m_aChildren.end(); /* increment is done in body */)
310*b1cdbd2cSJim Jagielski 		{
311*b1cdbd2cSJim Jagielski 			OHierarchyElementList_Impl::iterator aTmpIter = aIter;
312*b1cdbd2cSJim Jagielski 			aIter++;
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 			if ( aTmpIter->second == aRef )
315*b1cdbd2cSJim Jagielski 				m_aChildren.erase( aTmpIter );
316*b1cdbd2cSJim Jagielski 		}
317*b1cdbd2cSJim Jagielski 	}
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 	TestForClosing();
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski // XTransactionListener
323*b1cdbd2cSJim Jagielski //-----------------------------------------------
preCommit(const::com::sun::star::lang::EventObject &)324*b1cdbd2cSJim Jagielski void SAL_CALL OHierarchyElement_Impl::preCommit( const ::com::sun::star::lang::EventObject& /*aEvent*/ )
325*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski //-----------------------------------------------
commited(const::com::sun::star::lang::EventObject &)330*b1cdbd2cSJim Jagielski void SAL_CALL OHierarchyElement_Impl::commited( const ::com::sun::star::lang::EventObject& /*aEvent*/ )
331*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::RuntimeException)
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski 	try
334*b1cdbd2cSJim Jagielski 	{
335*b1cdbd2cSJim Jagielski 		Commit();
336*b1cdbd2cSJim Jagielski 	}
337*b1cdbd2cSJim Jagielski 	catch( uno::Exception& e )
338*b1cdbd2cSJim Jagielski 	{
339*b1cdbd2cSJim Jagielski 		throw lang::WrappedTargetRuntimeException(
340*b1cdbd2cSJim Jagielski 							::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not commit storage sequence!" ) ),
341*b1cdbd2cSJim Jagielski 							uno::Reference< uno::XInterface >(),
342*b1cdbd2cSJim Jagielski 							uno::makeAny( e ) );
343*b1cdbd2cSJim Jagielski 	}
344*b1cdbd2cSJim Jagielski }
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski //-----------------------------------------------
preRevert(const::com::sun::star::lang::EventObject &)347*b1cdbd2cSJim Jagielski void SAL_CALL OHierarchyElement_Impl::preRevert( const ::com::sun::star::lang::EventObject& /*aEvent*/ )
348*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski }
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski //-----------------------------------------------
reverted(const::com::sun::star::lang::EventObject &)353*b1cdbd2cSJim Jagielski void SAL_CALL OHierarchyElement_Impl::reverted( const ::com::sun::star::lang::EventObject& /*aEvent*/ )
354*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::RuntimeException)
355*b1cdbd2cSJim Jagielski {
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
358