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