xref: /aoo4110/main/package/source/xstor/xstorage.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_package.hxx"
26 #include <com/sun/star/beans/PropertyValue.hpp>
27 #include <com/sun/star/embed/ElementModes.hpp>
28 #include <com/sun/star/embed/UseBackupException.hpp>
29 #include <com/sun/star/embed/StorageFormats.hpp>
30 #include <com/sun/star/ucb/XProgressHandler.hpp>
31 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
32 #include <com/sun/star/container/XEnumerationAccess.hpp>
33 #include <com/sun/star/container/XNamed.hpp>
34 #include <com/sun/star/util/XChangesBatch.hpp>
35 #include <com/sun/star/util/XCloneable.hpp>
36 
37 
38 #include <com/sun/star/lang/XUnoTunnel.hpp>
39 #include <com/sun/star/lang/XComponent.hpp>
40 #include <com/sun/star/lang/DisposedException.hpp>
41 #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
42 #include <com/sun/star/beans/NamedValue.hpp>
43 
44 #include <PackageConstants.hxx>
45 
46 #include <cppuhelper/typeprovider.hxx>
47 #include <cppuhelper/exc_hlp.hxx>
48 #include <rtl/logfile.hxx>
49 #include <rtl/instance.hxx>
50 
51 #include <comphelper/processfactory.hxx>
52 #include <comphelper/componentcontext.hxx>
53 #include <comphelper/storagehelper.hxx>
54 #include <comphelper/ofopxmlhelper.hxx>
55 
56 #include "xstorage.hxx"
57 #include "owriteablestream.hxx"
58 #include "disposelistener.hxx"
59 #include "switchpersistencestream.hxx"
60 #include "ohierarchyholder.hxx"
61 
62 using namespace ::com::sun::star;
63 
64 //=========================================================
65 
66 typedef ::std::list< uno::WeakReference< lang::XComponent > > WeakComponentList;
67 
68 struct StorInternalData_Impl
69 {
70 	SotMutexHolderRef m_rSharedMutexRef;
71 	::cppu::OMultiTypeInterfaceContainerHelper m_aListenersContainer; // list of listeners
72 	::cppu::OTypeCollection* m_pTypeCollection;
73 	sal_Bool m_bIsRoot;
74 	sal_Int32 m_nStorageType; // the mode in wich the storage is used
75 	sal_Bool m_bReadOnlyWrap;
76 
77 	OChildDispListener_Impl* m_pSubElDispListener;
78 
79 	WeakComponentList m_aOpenSubComponentsList;
80 
81 	::rtl::Reference< OHierarchyHolder_Impl > m_rHierarchyHolder;
82 
83 	// the mutex reference MUST NOT be empty
StorInternalData_ImplStorInternalData_Impl84 	StorInternalData_Impl( const SotMutexHolderRef& rMutexRef, sal_Bool bRoot, sal_Int32 nStorageType, sal_Bool bReadOnlyWrap )
85 	: m_rSharedMutexRef( rMutexRef )
86 	, m_aListenersContainer( rMutexRef->GetMutex() )
87 	, m_pTypeCollection( NULL )
88 	, m_bIsRoot( bRoot )
89 	, m_nStorageType( nStorageType )
90 	, m_bReadOnlyWrap( bReadOnlyWrap )
91 	, m_pSubElDispListener( NULL )
92 	{}
93 
94 	~StorInternalData_Impl();
95 };
96 
97 //=========================================================
98 ::rtl::OUString GetNewTempFileURL( const uno::Reference< lang::XMultiServiceFactory > xFactory );
99 
100 // static
completeStorageStreamCopy_Impl(const uno::Reference<io::XStream> & xSource,const uno::Reference<io::XStream> & xDest,sal_Int32 nStorageType,const uno::Sequence<uno::Sequence<beans::StringPair>> & aRelInfo)101 void OStorage_Impl::completeStorageStreamCopy_Impl(
102 							const uno::Reference< io::XStream >& xSource,
103 							const uno::Reference< io::XStream >& xDest,
104 							sal_Int32 nStorageType,
105 							const uno::Sequence< uno::Sequence< beans::StringPair > >& aRelInfo )
106 {
107 		uno::Reference< beans::XPropertySet > xSourceProps( xSource, uno::UNO_QUERY );
108 		uno::Reference< beans::XPropertySet > xDestProps( xDest, uno::UNO_QUERY );
109 		if ( !xSourceProps.is() || !xDestProps.is() )
110 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
111 
112 		uno::Reference< io::XOutputStream > xDestOutStream = xDest->getOutputStream();
113 		if ( !xDestOutStream.is() )
114 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
115 
116 		uno::Reference< io::XInputStream > xSourceInStream = xSource->getInputStream();
117 		if ( !xSourceInStream.is() )
118 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
119 
120 		// TODO: headers of encripted streams should be copied also
121 		::comphelper::OStorageHelper::CopyInputToOutput( xSourceInStream, xDestOutStream );
122 
123 		uno::Sequence< ::rtl::OUString > aPropNames( 1 );
124 		aPropNames[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Compressed" ) );
125 
126 		if ( nStorageType == embed::StorageFormats::PACKAGE )
127 		{
128 			aPropNames.realloc( 3 );
129 			aPropNames[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) );
130 			aPropNames[2] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UseCommonStoragePasswordEncryption" ) );
131 		}
132 		else if ( nStorageType == embed::StorageFormats::OFOPXML )
133 		{
134 			// TODO/LATER: in future it might make sence to provide the stream if there is one
135 			uno::Reference< embed::XRelationshipAccess > xRelAccess( xDest, uno::UNO_QUERY_THROW );
136 			xRelAccess->clearRelationships();
137 			xRelAccess->insertRelationships( aRelInfo, sal_False );
138 
139 			aPropNames.realloc( 2 );
140 			aPropNames[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) );
141 		}
142 
143 		for ( int ind = 0; ind < aPropNames.getLength(); ind++ )
144 			xDestProps->setPropertyValue( aPropNames[ind], xSourceProps->getPropertyValue( aPropNames[ind] ) );
145 }
146 
GetSeekableTempCopy(uno::Reference<io::XInputStream> xInStream,uno::Reference<lang::XMultiServiceFactory> xFactory)147 uno::Reference< io::XInputStream > GetSeekableTempCopy( uno::Reference< io::XInputStream > xInStream,
148 														uno::Reference< lang::XMultiServiceFactory > xFactory )
149 {
150 	uno::Reference < io::XOutputStream > xTempOut(
151 						xFactory->createInstance ( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.TempFile" ) ) ),
152 						uno::UNO_QUERY );
153 	uno::Reference < io::XInputStream > xTempIn( xTempOut, uno::UNO_QUERY );
154 
155 	if ( !xTempOut.is() || !xTempIn.is() )
156 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
157 
158 	::comphelper::OStorageHelper::CopyInputToOutput( xInStream, xTempOut );
159 	xTempOut->closeOutput();
160 
161 	return xTempIn;
162 }
163 
~StorInternalData_Impl()164 StorInternalData_Impl::~StorInternalData_Impl()
165 {
166 	if ( m_pTypeCollection )
167 		delete m_pTypeCollection;
168 }
169 
170 
SotElement_Impl(const::rtl::OUString & rName,sal_Bool bStor,sal_Bool bNew)171 SotElement_Impl::SotElement_Impl( const ::rtl::OUString& rName, sal_Bool bStor, sal_Bool bNew )
172 : m_aName( rName )
173 , m_aOriginalName( rName )
174 , m_bIsRemoved( sal_False )
175 , m_bIsInserted( bNew )
176 , m_bIsStorage( bStor )
177 , m_pStorage( NULL )
178 , m_pStream( NULL )
179 {
180 }
181 
~SotElement_Impl()182 SotElement_Impl::~SotElement_Impl()
183 {
184 	if ( m_pStorage )
185 		delete m_pStorage;
186 
187 	if ( m_pStream )
188 		delete m_pStream;
189 }
190 
191 //-----------------------------------------------
192 // most of properties are holt by the storage but are not used
OStorage_Impl(uno::Reference<io::XInputStream> xInputStream,sal_Int32 nMode,uno::Sequence<beans::PropertyValue> xProperties,uno::Reference<lang::XMultiServiceFactory> xFactory,sal_Int32 nStorageType)193 OStorage_Impl::OStorage_Impl(	uno::Reference< io::XInputStream > xInputStream,
194 								sal_Int32 nMode,
195 								uno::Sequence< beans::PropertyValue > xProperties,
196 								uno::Reference< lang::XMultiServiceFactory > xFactory,
197 								sal_Int32 nStorageType )
198 : m_rMutexRef( new SotMutexHolder )
199 , m_pAntiImpl( NULL )
200 , m_nStorageMode( nMode & ~embed::ElementModes::SEEKABLE )
201 , m_bIsModified( ( nMode & ( embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ) ) == ( embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ) )
202 , m_bBroadcastModified( sal_False )
203 , m_bCommited( sal_False )
204 , m_bIsRoot( sal_True )
205 , m_bListCreated( sal_False )
206 , m_xFactory( xFactory )
207 , m_xProperties( xProperties )
208 , m_bHasCommonEncryptionData( sal_False )
209 , m_pParent( NULL )
210 , m_bControlMediaType( sal_False )
211 , m_bMTFallbackUsed( sal_False )
212 , m_bControlVersion( sal_False )
213 , m_pSwitchStream( NULL )
214 , m_nStorageType( nStorageType )
215 , m_pRelStorElement( NULL )
216 , m_nRelInfoStatus( RELINFO_NO_INIT )
217 {
218 	// all the checks done below by assertion statements must be done by factory
219 	OSL_ENSURE( xInputStream.is(), "No input stream is provided!\n" );
220 
221 	m_pSwitchStream = (SwitchablePersistenceStream*) new SwitchablePersistenceStream( xFactory, xInputStream );
222 	m_xInputStream = m_pSwitchStream->getInputStream();
223 
224 	if ( m_nStorageMode & embed::ElementModes::WRITE )
225 	{
226 		// check that the stream allows to write
227 		OSL_ENSURE( sal_False, "No stream for writing is provided!\n" );
228     }
229 }
230 
231 //-----------------------------------------------
232 // most of properties are holt by the storage but are not used
OStorage_Impl(uno::Reference<io::XStream> xStream,sal_Int32 nMode,uno::Sequence<beans::PropertyValue> xProperties,uno::Reference<lang::XMultiServiceFactory> xFactory,sal_Int32 nStorageType)233 OStorage_Impl::OStorage_Impl(	uno::Reference< io::XStream > xStream,
234 								sal_Int32 nMode,
235 								uno::Sequence< beans::PropertyValue > xProperties,
236 								uno::Reference< lang::XMultiServiceFactory > xFactory,
237 								sal_Int32 nStorageType )
238 : m_rMutexRef( new SotMutexHolder )
239 , m_pAntiImpl( NULL )
240 , m_nStorageMode( nMode & ~embed::ElementModes::SEEKABLE )
241 , m_bIsModified( ( nMode & ( embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ) ) == ( embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ) )
242 , m_bBroadcastModified( sal_False )
243 , m_bCommited( sal_False )
244 , m_bIsRoot( sal_True )
245 , m_bListCreated( sal_False )
246 , m_xFactory( xFactory )
247 , m_xProperties( xProperties )
248 , m_bHasCommonEncryptionData( sal_False )
249 , m_pParent( NULL )
250 , m_bControlMediaType( sal_False )
251 , m_bMTFallbackUsed( sal_False )
252 , m_bControlVersion( sal_False )
253 , m_pSwitchStream( NULL )
254 , m_nStorageType( nStorageType )
255 , m_pRelStorElement( NULL )
256 , m_nRelInfoStatus( RELINFO_NO_INIT )
257 {
258 	// all the checks done below by assertion statements must be done by factory
259 	OSL_ENSURE( xStream.is(), "No stream is provided!\n" );
260 
261 	if ( m_nStorageMode & embed::ElementModes::WRITE )
262 	{
263 		m_pSwitchStream = (SwitchablePersistenceStream*) new SwitchablePersistenceStream( xFactory, xStream );
264 		m_xStream = static_cast< io::XStream* >( m_pSwitchStream );
265     }
266 	else
267 	{
268 		m_pSwitchStream = (SwitchablePersistenceStream*) new SwitchablePersistenceStream( xFactory,
269 																						  xStream->getInputStream() );
270 		m_xInputStream = m_pSwitchStream->getInputStream();
271 	}
272 }
273 
274 //-----------------------------------------------
OStorage_Impl(OStorage_Impl * pParent,sal_Int32 nMode,uno::Reference<container::XNameContainer> xPackageFolder,uno::Reference<lang::XSingleServiceFactory> xPackage,uno::Reference<lang::XMultiServiceFactory> xFactory,sal_Int32 nStorageType)275 OStorage_Impl::OStorage_Impl(	OStorage_Impl* pParent,
276 								sal_Int32 nMode,
277 								uno::Reference< container::XNameContainer > xPackageFolder,
278 								uno::Reference< lang::XSingleServiceFactory > xPackage,
279 								uno::Reference< lang::XMultiServiceFactory > xFactory,
280 								sal_Int32 nStorageType )
281 : m_rMutexRef( new SotMutexHolder )
282 , m_pAntiImpl( NULL )
283 , m_nStorageMode( nMode & ~embed::ElementModes::SEEKABLE )
284 , m_bIsModified( ( nMode & ( embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ) ) == ( embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ) )
285 , m_bBroadcastModified( sal_False )
286 , m_bCommited( sal_False )
287 , m_bIsRoot( sal_False )
288 , m_bListCreated( sal_False )
289 , m_xPackageFolder( xPackageFolder )
290 , m_xPackage( xPackage )
291 , m_xFactory( xFactory )
292 , m_bHasCommonEncryptionData( sal_False )
293 , m_pParent( pParent ) // can be empty in case of temporary readonly substorages and relation storage
294 , m_bControlMediaType( sal_False )
295 , m_bMTFallbackUsed( sal_False )
296 , m_bControlVersion( sal_False )
297 , m_pSwitchStream( NULL )
298 , m_nStorageType( nStorageType )
299 , m_pRelStorElement( NULL )
300 , m_nRelInfoStatus( RELINFO_NO_INIT )
301 {
302 	OSL_ENSURE( xPackageFolder.is(), "No package folder!\n" );
303 }
304 
305 //-----------------------------------------------
~OStorage_Impl()306 OStorage_Impl::~OStorage_Impl()
307 {
308 	{
309 		::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
310 		if ( m_pAntiImpl ) // root storage wrapper must set this member to NULL before destruction of object
311 		{
312 			OSL_ENSURE( !m_bIsRoot, "The root storage wrapper must be disposed already" );
313 
314 			try {
315 				m_pAntiImpl->InternalDispose( sal_False );
316 			}
317 			catch ( uno::Exception& aException )
318             {
319                 AddLog( aException.Message );
320                 AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Quiet exception" ) ) );
321             }
322 			m_pAntiImpl = NULL;
323 		}
324 		else if ( !m_aReadOnlyWrapList.empty() )
325 		{
326 			for ( OStorageList_Impl::iterator pStorageIter = m_aReadOnlyWrapList.begin();
327 				  pStorageIter != m_aReadOnlyWrapList.end(); pStorageIter++ )
328 			{
329 				uno::Reference< embed::XStorage > xTmp = pStorageIter->m_xWeakRef;
330 				if ( xTmp.is() )
331 					try {
332 						pStorageIter->m_pPointer->InternalDispose( sal_False );
333 					} catch( uno::Exception& aException )
334                     {
335                         AddLog( aException.Message );
336                         AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Quiet exception" ) ) );
337                     }
338 			}
339 
340 			m_aReadOnlyWrapList.clear();
341 		}
342 
343 		m_pParent = NULL;
344 	}
345 
346 	for ( SotElementList_Impl::iterator pElementIter = m_aChildrenList.begin();
347 		  pElementIter != m_aChildrenList.end(); pElementIter++ )
348 		delete *pElementIter;
349 
350 	m_aChildrenList.clear();
351 
352 	for ( SotElementList_Impl::iterator pDeletedIter = m_aDeletedList.begin();
353 		  pDeletedIter != m_aDeletedList.end(); pDeletedIter++ )
354 		delete *pDeletedIter;
355 
356 	m_aDeletedList.clear();
357 
358 	if ( m_nStorageType == embed::StorageFormats::OFOPXML && m_pRelStorElement )
359 	{
360 		delete m_pRelStorElement;
361 		m_pRelStorElement = NULL;
362 	}
363 
364 	m_xPackageFolder = uno::Reference< container::XNameContainer >();
365 	m_xPackage = uno::Reference< lang::XSingleServiceFactory >();
366 
367 	::rtl::OUString aPropertyName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
368 	for ( sal_Int32 aInd = 0; aInd < m_xProperties.getLength(); aInd++ )
369 	{
370 		if ( m_xProperties[aInd].Name.equals( aPropertyName ) )
371 		{
372 			// the storage is URL based so all the streams are opened by factory and should be closed
373 			try
374 			{
375 				if ( m_xInputStream.is() )
376 				{
377 					m_xInputStream->closeInput();
378 					m_xInputStream = uno::Reference< io::XInputStream >();
379 				}
380 
381 				if ( m_xStream.is() )
382 				{
383 					uno::Reference< io::XInputStream > xInStr = m_xStream->getInputStream();
384 					if ( xInStr.is() )
385 						xInStr->closeInput();
386 
387 					uno::Reference< io::XOutputStream > xOutStr = m_xStream->getOutputStream();
388 					if ( xOutStr.is() )
389 						xOutStr->closeOutput();
390 
391 					m_xStream = uno::Reference< io::XStream >();
392 				}
393 			}
394 			catch( uno::Exception& aException )
395             {
396                 AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Quiet exception" ) ) );
397                 AddLog( aException.Message );
398             }
399 		}
400 	}
401 }
402 
403 //-----------------------------------------------
AddLog(const::rtl::OUString & aMessage)404 void OStorage_Impl::AddLog( const ::rtl::OUString& aMessage )
405 {
406     if ( !m_xLogRing.is() )
407     {
408         try
409         {
410             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
411             if ( aContext.is() )
412                 m_xLogRing.set( aContext.getSingleton( "com.sun.star.logging.DocumentIOLogRing" ), uno::UNO_QUERY_THROW );
413         }
414         catch( uno::Exception& )
415         {
416             // No log
417         }
418     }
419 
420     if ( m_xLogRing.is() )
421         m_xLogRing->logString( aMessage );
422 }
423 
424 //-----------------------------------------------
SetReadOnlyWrap(OStorage & aStorage)425 void OStorage_Impl::SetReadOnlyWrap( OStorage& aStorage )
426 {
427 	// Weak reference is used inside the holder so the refcount must not be zero at this point
428 	OSL_ENSURE( aStorage.GetRefCount_Impl(), "There must be a reference alive to use this method!\n" );
429 	m_aReadOnlyWrapList.push_back( StorageHolder_Impl( &aStorage ) );
430 }
431 
432 //-----------------------------------------------
RemoveReadOnlyWrap(OStorage & aStorage)433 void OStorage_Impl::RemoveReadOnlyWrap( OStorage& aStorage )
434 {
435 	for ( OStorageList_Impl::iterator pStorageIter = m_aReadOnlyWrapList.begin();
436 	  pStorageIter != m_aReadOnlyWrapList.end();)
437 	{
438 		uno::Reference< embed::XStorage > xTmp = pStorageIter->m_xWeakRef;
439 		if ( !xTmp.is() || pStorageIter->m_pPointer == &aStorage )
440 		{
441 			try {
442 				pStorageIter->m_pPointer->InternalDispose( sal_False );
443 			} catch( uno::Exception& aException )
444             {
445                 AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Quiet exception" ) ) );
446                 AddLog( aException.Message );
447             }
448 
449 			OStorageList_Impl::iterator pIterToDelete( pStorageIter );
450 			pStorageIter++;
451 			m_aReadOnlyWrapList.erase( pIterToDelete );
452 		}
453 		else
454 			pStorageIter++;
455 	}
456 }
457 
458 //-----------------------------------------------
OpenOwnPackage()459 void OStorage_Impl::OpenOwnPackage()
460 {
461 	OSL_ENSURE( m_bIsRoot, "Opening of the package has no sence!\n" );
462 
463 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
464 
465 	if ( !m_xPackageFolder.is() )
466 	{
467 		if ( !m_xPackage.is() )
468 		{
469         	uno::Sequence< uno::Any > aArguments( 2 );
470 			if ( m_nStorageMode & embed::ElementModes::WRITE )
471 				aArguments[ 0 ] <<= m_xStream;
472 			else
473 			{
474 				OSL_ENSURE( m_xInputStream.is(), "Input stream must be set for readonly access!\n" );
475 				aArguments[ 0 ] <<= m_xInputStream;
476 				// TODO: if input stream is not seekable or XSeekable interface is supported
477 				// on XStream object a wrapper must be used
478 			}
479 
480 			// do not allow elements to remove themself from the old container in case of insertion to another container
481 			aArguments[ 1 ] <<= beans::NamedValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "AllowRemoveOnInsert" ) ),
482 													uno::makeAny( (sal_Bool)sal_False ) );
483 
484 			sal_Int32 nArgNum = 2;
485 			for ( sal_Int32 aInd = 0; aInd < m_xProperties.getLength(); aInd++ )
486 			{
487 				if ( m_xProperties[aInd].Name.equalsAscii( "RepairPackage" )
488 				  || m_xProperties[aInd].Name.equalsAscii( "ProgressHandler" ) )
489 				{
490 					beans::NamedValue aNamedValue( m_xProperties[aInd].Name,
491 													m_xProperties[aInd].Value );
492 					aArguments.realloc( ++nArgNum );
493 					aArguments[nArgNum-1] <<= aNamedValue;
494 				}
495 				else if ( m_xProperties[aInd].Name.equalsAscii( "Password" ) )
496 				{
497 					// TODO: implement password setting for documents
498 					// the password entry must be removed after setting
499 				}
500 			}
501 
502 			if ( m_nStorageType == embed::StorageFormats::ZIP )
503 			{
504 				// let the package support only plain zip format
505 				beans::NamedValue aNamedValue;
506 				aNamedValue.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StorageFormat" ) );
507 				aNamedValue.Value <<= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ZipFormat" ) );
508 				aArguments.realloc( ++nArgNum );
509 				aArguments[nArgNum-1] <<= aNamedValue;
510 			}
511 			else if ( m_nStorageType == embed::StorageFormats::OFOPXML )
512 			{
513 				// let the package support OFOPXML media type handling
514 				beans::NamedValue aNamedValue;
515 				aNamedValue.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StorageFormat" ) );
516 				aNamedValue.Value <<= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OFOPXMLFormat" ) );
517 				aArguments.realloc( ++nArgNum );
518 				aArguments[nArgNum-1] <<= aNamedValue;
519 			}
520 
521         	m_xPackage = uno::Reference< lang::XSingleServiceFactory > (
522 										GetServiceFactory()->createInstanceWithArguments(
523 											::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.packages.comp.ZipPackage" ) ),
524                 							aArguments ),
525 										uno::UNO_QUERY );
526 		}
527 
528 		uno::Reference< container::XHierarchicalNameAccess > xHNameAccess( m_xPackage, uno::UNO_QUERY );
529 		OSL_ENSURE( xHNameAccess.is(), "The package could not be created!\n" );
530 
531 		if ( xHNameAccess.is() )
532 		{
533 			uno::Any aFolder = xHNameAccess->getByHierarchicalName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) ) );
534 			aFolder >>= m_xPackageFolder;
535 		}
536 	}
537 
538 	OSL_ENSURE( m_xPackageFolder.is(), "The package root folder can not be opened!\n" );
539 	if ( !m_xPackageFolder.is() )
540 		throw embed::InvalidStorageException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
541 }
542 
543 //-----------------------------------------------
GetServiceFactory()544 uno::Reference< lang::XMultiServiceFactory > OStorage_Impl::GetServiceFactory()
545 {
546 	if ( m_xFactory.is() )
547 		return m_xFactory;
548 
549 	return ::comphelper::getProcessServiceFactory();
550 }
551 
552 //-----------------------------------------------
GetChildrenList()553 SotElementList_Impl& OStorage_Impl::GetChildrenList()
554 {
555 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
556 
557 	ReadContents();
558 	return m_aChildrenList;
559 }
560 
561 //-----------------------------------------------
GetStorageProperties()562 void OStorage_Impl::GetStorageProperties()
563 {
564 	if ( m_nStorageType == embed::StorageFormats::PACKAGE )
565     {
566         uno::Reference< beans::XPropertySet > xProps( m_xPackageFolder, uno::UNO_QUERY_THROW );
567 
568         if ( !m_bControlMediaType )
569         {
570             uno::Reference< beans::XPropertySet > xPackageProps( m_xPackage, uno::UNO_QUERY_THROW );
571             xPackageProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( MEDIATYPE_FALLBACK_USED_PROPERTY ) ) ) >>= m_bMTFallbackUsed;
572 
573             xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ) ) >>= m_aMediaType;
574             m_bControlMediaType = sal_True;
575         }
576 
577         if ( !m_bControlVersion )
578         {
579             xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) ) >>= m_aVersion;
580             m_bControlVersion = sal_True;
581         }
582     }
583 
584 	// the properties of OFOPXML will be handled directly
585 }
586 
587 //-----------------------------------------------
ReadRelInfoIfNecessary()588 void OStorage_Impl::ReadRelInfoIfNecessary()
589 {
590 	if ( m_nStorageType != embed::StorageFormats::OFOPXML )
591 		return;
592 
593 	if ( m_nRelInfoStatus == RELINFO_NO_INIT )
594 	{
595 		// Init from original stream
596 		uno::Reference< io::XInputStream > xRelInfoStream = GetRelInfoStreamForName( ::rtl::OUString() );
597 		if ( xRelInfoStream.is() )
598 			m_aRelInfo = ::comphelper::OFOPXMLHelper::ReadRelationsInfoSequence(
599 									xRelInfoStream,
600 									::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels/.rels" ) ),
601 									m_xFactory );
602 
603 		m_nRelInfoStatus = RELINFO_READ;
604 	}
605 	else if ( m_nRelInfoStatus == RELINFO_CHANGED_STREAM )
606 	{
607 		// Init from the new stream
608 		try
609 		{
610 			if ( m_xNewRelInfoStream.is() )
611 				m_aRelInfo = ::comphelper::OFOPXMLHelper::ReadRelationsInfoSequence(
612 										m_xNewRelInfoStream,
613 										::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels/.rels" ) ),
614 										m_xFactory );
615 
616 			m_nRelInfoStatus = RELINFO_CHANGED_STREAM_READ;
617 		}
618 		catch( uno::Exception )
619 		{
620 			m_nRelInfoStatus = RELINFO_CHANGED_BROKEN;
621 		}
622 	}
623 }
624 
625 //-----------------------------------------------
ReadContents()626 void OStorage_Impl::ReadContents()
627 {
628 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
629 
630     if ( m_bListCreated )
631         return;
632 
633 	if ( m_bIsRoot )
634 		OpenOwnPackage();
635 
636 	uno::Reference< container::XEnumerationAccess > xEnumAccess( m_xPackageFolder, uno::UNO_QUERY );
637 	if ( !xEnumAccess.is() )
638 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
639 
640 	uno::Reference< container::XEnumeration > xEnum = xEnumAccess->createEnumeration();
641 	if ( !xEnum.is() )
642 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
643 
644     m_bListCreated = sal_True;
645 
646 	while( xEnum->hasMoreElements() )
647 	{
648 		try {
649 			uno::Reference< container::XNamed > xNamed;
650 			xEnum->nextElement() >>= xNamed;
651 
652 			if ( !xNamed.is() )
653 			{
654 				OSL_ENSURE( sal_False, "XNamed is not supported!\n" );
655 				throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
656 			}
657 
658 			::rtl::OUString aName = xNamed->getName();
659 			OSL_ENSURE( aName.getLength(), "Empty name!\n" );
660 
661 			uno::Reference< container::XNameContainer > xNameContainer( xNamed, uno::UNO_QUERY );
662 
663 			SotElement_Impl* pNewElement = new SotElement_Impl( aName, xNameContainer.is(), sal_False );
664 			if ( m_nStorageType == embed::StorageFormats::OFOPXML && aName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
665 			{
666 				if ( !pNewElement->m_bIsStorage )
667 					throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: Unexpected format
668 
669 				m_pRelStorElement = pNewElement;
670 				CreateRelStorage();
671 			}
672 			else
673 			{
674 				if ( ( m_nStorageMode & embed::ElementModes::TRUNCATE ) == embed::ElementModes::TRUNCATE )
675 				{
676 					// if a storage is truncated all of it elements are marked as deleted
677 					pNewElement->m_bIsRemoved = sal_True;
678 				}
679 
680 				m_aChildrenList.push_back( pNewElement );
681 			}
682 		}
683 		catch( container::NoSuchElementException& aNoSuchElementException )
684         {
685             AddLog( aNoSuchElementException.Message );
686             AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "NoSuchElement" ) ) );
687 
688 			OSL_ENSURE( sal_False, "hasMoreElements() implementation has problems!\n" );
689 			break;
690 		}
691 	}
692 	if ( ( m_nStorageMode & embed::ElementModes::TRUNCATE ) == embed::ElementModes::TRUNCATE )
693 	{
694 		// if a storage is truncated the relations information should be cleaned
695 		m_xNewRelInfoStream = uno::Reference< io::XInputStream >();
696 		m_aRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >();
697 		m_nRelInfoStatus = RELINFO_CHANGED;
698 	}
699 
700 	// cache changeable folder properties
701 	GetStorageProperties();
702 }
703 
704 //-----------------------------------------------
CopyToStorage(const uno::Reference<embed::XStorage> & xDest,sal_Bool bDirect)705 void OStorage_Impl::CopyToStorage( const uno::Reference< embed::XStorage >& xDest, sal_Bool bDirect )
706 {
707 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
708 
709 	uno::Reference< beans::XPropertySet > xPropSet( xDest, uno::UNO_QUERY );
710 	if ( !xPropSet.is() )
711 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 );
712 
713 	sal_Int32 nDestMode = embed::ElementModes::READ;
714 	xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OpenMode" ) ) ) >>= nDestMode;
715 
716 	if ( !( nDestMode & embed::ElementModes::WRITE ) )
717 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access_denied
718 
719 	ReadContents();
720 
721 	if ( !m_xPackageFolder.is() )
722 		throw embed::InvalidStorageException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
723 
724 	for ( SotElementList_Impl::iterator pElementIter = m_aChildrenList.begin();
725 		  pElementIter != m_aChildrenList.end(); pElementIter++ )
726     {
727 		if ( !(*pElementIter)->m_bIsRemoved )
728 			CopyStorageElement( *pElementIter, xDest, (*pElementIter)->m_aName, bDirect );
729 	}
730 
731 	// move storage properties to the destination one ( means changeable properties )
732 	if ( m_nStorageType == embed::StorageFormats::PACKAGE )
733 	{
734 		::rtl::OUString aMediaTypeString = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) );
735 		::rtl::OUString aVersionString = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) );
736 		xPropSet->setPropertyValue( aMediaTypeString, uno::makeAny( m_aMediaType ) );
737 		xPropSet->setPropertyValue( aVersionString, uno::makeAny( m_aVersion ) );
738 	}
739 
740 	if ( m_nStorageType == embed::StorageFormats::PACKAGE )
741 	{
742 		// if this is a root storage, the common key from current one should be moved there
743 		sal_Bool bIsRoot = sal_False;
744 		::rtl::OUString aRootString = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsRoot" ) );
745 		if ( ( xPropSet->getPropertyValue( aRootString ) >>= bIsRoot ) && bIsRoot )
746 		{
747 			try
748 			{
749 				uno::Reference< embed::XEncryptionProtectedStorage > xEncr( xDest, uno::UNO_QUERY );
750 				if ( xEncr.is() )
751                 {
752 					xEncr->setEncryptionData( GetCommonRootEncryptionData().getAsConstNamedValueList() );
753 
754                     uno::Sequence< beans::NamedValue > aAlgorithms;
755                     uno::Reference< beans::XPropertySet > xPackPropSet( m_xPackage, uno::UNO_QUERY_THROW );
756                     xPackPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ENCRYPTION_ALGORITHMS_PROPERTY ) ) )
757                         >>= aAlgorithms;
758                     xEncr->setEncryptionAlgorithms( aAlgorithms );
759                 }
760 			}
761 			catch( packages::NoEncryptionException& aNoEncryptionException )
762             {
763                 AddLog( aNoEncryptionException.Message );
764                 AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No Encryption" ) ) );
765             }
766 		}
767 	}
768 	else if ( m_nStorageType == embed::StorageFormats::OFOPXML )
769 	{
770 
771 		// TODO/LATER: currently the optimization is not active
772 		// uno::Reference< io::XInputStream > xRelInfoStream = GetRelInfoStreamForName( ::rtl::OUString() ); // own stream
773 		// if ( xRelInfoStream.is() )
774 		// {
775 		// 	// Relations info stream is a writeonly property, introduced only to optimyze copying
776 		// 	// Should be used carefuly since no check for stream consistency is done, and the stream must not stay locked
777 		//
778 		// 	::rtl::OUString aRelInfoString = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RelationsInfoStream" ) );
779 		// 	xPropSet->setPropertyValue( aRelInfoString, uno::makeAny( GetSeekableTempCopy( xRelInfoStream, m_xFactory ) ) );
780 		// }
781 
782 		uno::Reference< embed::XRelationshipAccess > xRels( xDest, uno::UNO_QUERY );
783 		if ( !xRels.is() )
784 			throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 );
785 
786 		xRels->insertRelationships( GetAllRelationshipsIfAny(), sal_False );
787 	}
788 
789 	// if possible the destination storage should be commited after successful copying
790 	uno::Reference< embed::XTransactedObject > xObjToCommit( xDest, uno::UNO_QUERY );
791 	if ( xObjToCommit.is() )
792 		xObjToCommit->commit();
793 }
794 
795 //-----------------------------------------------
CopyStorageElement(SotElement_Impl * pElement,uno::Reference<embed::XStorage> xDest,::rtl::OUString aName,sal_Bool bDirect)796 void OStorage_Impl::CopyStorageElement( SotElement_Impl* pElement,
797 										uno::Reference< embed::XStorage > xDest,
798 										::rtl::OUString aName,
799 										sal_Bool bDirect )
800 {
801 	OSL_ENSURE( xDest.is(), "No destination storage!\n" );
802 	OSL_ENSURE( aName.getLength(), "Empty element name!\n" );
803 
804 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
805 
806 	uno::Reference< container::XNameAccess > xDestAccess( xDest, uno::UNO_QUERY );
807 	if ( !xDestAccess.is() )
808 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
809 
810 	if ( xDestAccess->hasByName( aName )
811 	  && !( pElement->m_bIsStorage && xDest->isStorageElement( aName ) ) )
812 		xDest->removeElement( aName );
813 
814 	if ( pElement->m_bIsStorage )
815 	{
816 		uno::Reference< embed::XStorage > xSubDest =
817 									xDest->openStorageElement(  aName,
818 																embed::ElementModes::WRITE );
819 
820 		OSL_ENSURE( xSubDest.is(), "No destination substorage!\n" );
821 
822 		if ( !pElement->m_pStorage )
823 		{
824 			OpenSubStorage( pElement, embed::ElementModes::READ );
825 			if ( !pElement->m_pStorage )
826 				throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
827 		}
828 
829 		pElement->m_pStorage->CopyToStorage( xSubDest, bDirect );
830 	}
831 	else
832 	{
833 		if ( !pElement->m_pStream )
834 		{
835 			OpenSubStream( pElement );
836 			if ( !pElement->m_pStream )
837 				throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
838 		}
839 
840 		if ( !pElement->m_pStream->IsEncrypted() )
841 		{
842 			if ( bDirect )
843 			{
844 				// fill in the properties for the stream
845 				uno::Sequence< beans::PropertyValue > aStrProps(0);
846 				uno::Sequence< beans::PropertyValue > aSrcPkgProps = pElement->m_pStream->GetStreamProperties();
847 				sal_Int32 nNum = 0;
848 				for ( int ind = 0; ind < aSrcPkgProps.getLength(); ind++ )
849 				{
850 					if ( aSrcPkgProps[ind].Name.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "MediaType" ) ) )
851 					  || aSrcPkgProps[ind].Name.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "Compressed" ) ) ) )
852 					{
853 						aStrProps.realloc( ++nNum );
854 						aStrProps[nNum-1].Name = aSrcPkgProps[ind].Name;
855 						aStrProps[nNum-1].Value = aSrcPkgProps[ind].Value;
856 					}
857 				}
858 
859 				if ( m_nStorageType == embed::StorageFormats::PACKAGE )
860 				{
861 					aStrProps.realloc( ++nNum );
862 					aStrProps[nNum-1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UseCommonStoragePasswordEncryption" ) );
863 					aStrProps[nNum-1].Value <<= (sal_Bool)( pElement->m_pStream->UsesCommonEncryption_Impl() );
864 				}
865 				else if ( m_nStorageType == embed::StorageFormats::OFOPXML )
866 				{
867 					// TODO/LATER: currently the optimization is not active
868 					// uno::Reference< io::XInputStream > xInStream = GetRelInfoStreamForName( ::rtl::OUString() ); // own rels stream
869 					// if ( xInStream.is() )
870 					// {
871 					// 	aStrProps.realloc( ++nNum );
872 					// 	aStrProps[nNum-1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RelationsInfoStream" ) );
873 					// 	aStrProps[nNum-1].Value <<= GetSeekableTempCopy( xInStream, m_xFactory );
874 					// }
875 
876 					uno::Reference< embed::XRelationshipAccess > xRels( xDest, uno::UNO_QUERY );
877 					if ( !xRels.is() )
878 						throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 );
879 
880 					xRels->insertRelationships( GetAllRelationshipsIfAny(), sal_False );
881 				}
882 
883 				uno::Reference< embed::XOptimizedStorage > xOptDest( xDest, uno::UNO_QUERY_THROW );
884 				uno::Reference < io::XInputStream > xInputToInsert;
885 
886 				if ( pElement->m_pStream->HasTempFile_Impl() || !pElement->m_pStream->m_xPackageStream.is() )
887 				{
888 					OSL_ENSURE( pElement->m_pStream->m_xPackageStream.is(), "No package stream!" );
889 
890 					// if the stream is modified - the temporary file must be used for insertion
891 					xInputToInsert = pElement->m_pStream->GetTempFileAsInputStream();
892 				}
893 				else
894 				{
895 					// for now get just nonseekable access to the stream
896 					// TODO/LATER: the raw stream can be used
897 
898 					xInputToInsert = pElement->m_pStream->m_xPackageStream->getDataStream();
899 				}
900 
901 				if ( !xInputToInsert.is() )
902 						throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
903 
904 				xOptDest->insertStreamElementDirect( aName, xInputToInsert, aStrProps );
905 			}
906 			else
907 			{
908 				uno::Reference< io::XStream > xSubStr =
909 											xDest->openStreamElement( aName,
910 											embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE );
911 				OSL_ENSURE( xSubStr.is(), "No destination substream!\n" );
912 
913 				pElement->m_pStream->CopyInternallyTo_Impl( xSubStr );
914 			}
915 		}
916 		else if ( m_nStorageType != embed::StorageFormats::PACKAGE )
917 		{
918 			OSL_ENSURE( sal_False, "Encryption is only supported in package storage!\n" );
919 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
920 		}
921 		else if ( pElement->m_pStream->HasCachedEncryptionData()
922 			 && ( pElement->m_pStream->IsModified() || pElement->m_pStream->HasWriteOwner_Impl() ) )
923 		{
924             ::comphelper::SequenceAsHashMap aCommonEncryptionData;
925 			sal_Bool bHasCommonEncryptionData = sal_False;
926 			try
927 			{
928 				aCommonEncryptionData = GetCommonRootEncryptionData();
929 				bHasCommonEncryptionData = sal_True;
930 			}
931 			catch( packages::NoEncryptionException& aNoEncryptionException )
932             {
933                 AddLog( aNoEncryptionException.Message );
934                 AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No Encryption" ) ) );
935             }
936 
937 			if ( bHasCommonEncryptionData && ::package::PackageEncryptionDatasEqual( pElement->m_pStream->GetCachedEncryptionData(), aCommonEncryptionData ) )
938 			{
939 				// If the stream can be opened with the common storage password
940 				// it must be stored with the common storage password as well
941 				uno::Reference< io::XStream > xDestStream =
942 											xDest->openStreamElement( aName,
943 												embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE );
944 
945 				pElement->m_pStream->CopyInternallyTo_Impl( xDestStream );
946 
947 				uno::Reference< beans::XPropertySet > xProps( xDestStream, uno::UNO_QUERY_THROW );
948 				xProps->setPropertyValue(
949 					::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UseCommonStoragePasswordEncryption" ) ),
950 					uno::Any( (sal_Bool) sal_True ) );
951 			}
952 			else
953 			{
954 				// the stream is already opened for writing or was changed
955                 uno::Reference< embed::XStorage2 > xDest2( xDest, uno::UNO_QUERY_THROW );
956 				uno::Reference< io::XStream > xSubStr =
957 											xDest2->openEncryptedStream( aName,
958 												embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE,
959 												pElement->m_pStream->GetCachedEncryptionData().getAsConstNamedValueList() );
960 				OSL_ENSURE( xSubStr.is(), "No destination substream!\n" );
961 
962 				pElement->m_pStream->CopyInternallyTo_Impl( xSubStr, pElement->m_pStream->GetCachedEncryptionData() );
963 			}
964 		}
965 		else
966 		{
967 			// the stream is not opened at all, so it can be just opened for reading
968 			try
969 			{
970 				// If the stream can be opened with the common storage password
971 				// it must be stored with the common storage password as well
972 
973 				uno::Reference< io::XStream > xOwnStream = pElement->m_pStream->GetStream( embed::ElementModes::READ,
974 																							sal_False );
975 				uno::Reference< io::XStream > xDestStream =
976 											xDest->openStreamElement( aName,
977 												embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE );
978 				OSL_ENSURE( xDestStream.is(), "No destination substream!\n" );
979 				completeStorageStreamCopy_Impl( xOwnStream, xDestStream, m_nStorageType, GetAllRelationshipsIfAny() );
980 
981 				uno::Reference< beans::XPropertySet > xProps( xDestStream, uno::UNO_QUERY_THROW );
982 				xProps->setPropertyValue(
983 					::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UseCommonStoragePasswordEncryption" ) ),
984 					uno::Any( (sal_Bool) sal_True ) );
985 			}
986 			catch( packages::WrongPasswordException& aWrongPasswordException )
987 			{
988                 AddLog( aWrongPasswordException.Message );
989                 AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Handled exception" ) ) );
990 
991 				// If the common storage password does not allow to open the stream
992 				// it could be copyed in raw way, the problem is that the StartKey should be the same
993                 // in the ODF1.2 package, so an invalid package could be produced if the stream
994                 // is copied from ODF1.1 package, where it is allowed to have different StartKeys
995 				uno::Reference< embed::XStorageRawAccess > xRawDest( xDest, uno::UNO_QUERY_THROW );
996 				uno::Reference< io::XInputStream > xRawInStream = pElement->m_pStream->GetRawInStream();
997 				xRawDest->insertRawEncrStreamElement( aName, xRawInStream );
998 			}
999 		}
1000 	}
1001 }
1002 
1003 //-----------------------------------------------
GetAllRelationshipsIfAny()1004 uno::Sequence< uno::Sequence< beans::StringPair > > OStorage_Impl::GetAllRelationshipsIfAny()
1005 {
1006 	if ( m_nStorageType != embed::StorageFormats::OFOPXML )
1007 		return uno::Sequence< uno::Sequence< beans::StringPair > >();
1008 
1009 	ReadRelInfoIfNecessary();
1010 
1011 	if ( m_nRelInfoStatus == RELINFO_READ
1012 	  || m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ || m_nRelInfoStatus == RELINFO_CHANGED )
1013 		return m_aRelInfo;
1014 	else // m_nRelInfoStatus == RELINFO_CHANGED_BROKEN || m_nRelInfoStatus == RELINFO_BROKEN
1015 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Wrong relinfo stream!" ) ),
1016 									uno::Reference< uno::XInterface >() );
1017 }
1018 
1019 //-----------------------------------------------
CopyLastCommitTo(const uno::Reference<embed::XStorage> & xNewStor)1020 void OStorage_Impl::CopyLastCommitTo( const uno::Reference< embed::XStorage >& xNewStor )
1021 {
1022 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1023 
1024 	OSL_ENSURE( m_xPackageFolder.is(), "A commited storage is incomplete!\n" );
1025 	if ( !m_xPackageFolder.is() )
1026 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1027 
1028 	OStorage_Impl aTempRepresent( NULL,
1029 								embed::ElementModes::READ,
1030 								m_xPackageFolder,
1031 								m_xPackage,
1032 								m_xFactory,
1033 								m_nStorageType);
1034 
1035 	// TODO/LATER: could use direct copying
1036 	aTempRepresent.CopyToStorage( xNewStor, sal_False );
1037 }
1038 
1039 //-----------------------------------------------
InsertIntoPackageFolder(const::rtl::OUString & aName,const uno::Reference<container::XNameContainer> & xParentPackageFolder)1040 void OStorage_Impl::InsertIntoPackageFolder( const ::rtl::OUString& aName,
1041 											 const uno::Reference< container::XNameContainer >& xParentPackageFolder )
1042 {
1043 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1044 
1045 	OSL_ENSURE( m_xPackageFolder.is(), "An inserted storage is incomplete!\n" );
1046 	uno::Reference< lang::XUnoTunnel > xTunnel( m_xPackageFolder, uno::UNO_QUERY );
1047 	if ( !xTunnel.is() )
1048 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1049 
1050 	xParentPackageFolder->insertByName( aName, uno::makeAny( xTunnel ) );
1051 
1052 	m_bCommited = sal_False;
1053 }
1054 
1055 //-----------------------------------------------
Commit()1056 void OStorage_Impl::Commit()
1057 {
1058 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1059 
1060 	if ( !m_bIsModified )
1061 		return;
1062 
1063 	// in case of a new empty storage it is possible that the contents are still not read
1064 	// ( the storage of course has no contents, but the initialization is postponed till the first use,
1065 	//   thus if a new storage was created and commited immediatelly it must be initialized here )
1066 	ReadContents();
1067 
1068 	// if storage is commited it should have a valid Package representation
1069 	OSL_ENSURE( m_xPackageFolder.is(), "The package representation should exist!\n" );
1070 	if ( !m_xPackageFolder.is() )
1071 		throw embed::InvalidStorageException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1072 
1073 	OSL_ENSURE( m_nStorageMode & embed::ElementModes::WRITE,
1074 				"Commit of readonly storage, should be detected before!\n" );
1075 
1076 	uno::Reference< container::XNameContainer > xNewPackageFolder;
1077 
1078 	// here the storage will switch to the temporary package folder
1079 	// if the storage was already commited and the parent was not commited after that
1080 	// the switch should not be done since the package folder in use is a temporary one;
1081 	// it can be detected by m_bCommited flag ( root storage doesn't need temporary representation )
1082 	if ( !m_bCommited && !m_bIsRoot )
1083 	{
1084 		uno::Sequence< uno::Any > aSeq( 1 );
1085 		aSeq[0] <<= sal_True;
1086 
1087 		xNewPackageFolder = uno::Reference< container::XNameContainer >(
1088 													m_xPackage->createInstanceWithArguments( aSeq ),
1089 													uno::UNO_QUERY );
1090 	}
1091 	else
1092 		xNewPackageFolder = m_xPackageFolder;
1093 
1094 	// remove replaced removed elements
1095 	for ( SotElementList_Impl::iterator pDeletedIter = m_aDeletedList.begin();
1096 		  pDeletedIter != m_aDeletedList.end();
1097 		  pDeletedIter++ )
1098 	{
1099 
1100 		if ( m_nStorageType == embed::StorageFormats::OFOPXML && !(*pDeletedIter)->m_bIsStorage )
1101 			RemoveStreamRelInfo( (*pDeletedIter)->m_aOriginalName );
1102 
1103 		// the removed elements are not in new temporary storage
1104 		if ( m_bCommited || m_bIsRoot )
1105 			xNewPackageFolder->removeByName( (*pDeletedIter)->m_aOriginalName );
1106 		delete *pDeletedIter;
1107 		*pDeletedIter = NULL;
1108 	}
1109 	m_aDeletedList.clear();
1110 
1111 	// remove removed elements
1112 	SotElementList_Impl::iterator pElementIter = m_aChildrenList.begin();
1113 	while (  pElementIter != m_aChildrenList.end() )
1114     {
1115 		// renamed and inserted elements must be really inserted to package later
1116 		// since thay can conflict with removed elements
1117 
1118 		if ( (*pElementIter)->m_bIsRemoved )
1119 		{
1120 			if ( m_nStorageType == embed::StorageFormats::OFOPXML && !(*pElementIter)->m_bIsStorage )
1121 				RemoveStreamRelInfo( (*pElementIter)->m_aOriginalName );
1122 
1123 			// the removed elements are not in new temporary storage
1124 			if ( m_bCommited || m_bIsRoot )
1125 				xNewPackageFolder->removeByName( (*pElementIter)->m_aOriginalName );
1126 
1127 			SotElement_Impl* pToDelete = *pElementIter;
1128 
1129 			pElementIter++; // to let the iterator be valid it should be increased before removing
1130 
1131 			m_aChildrenList.remove( pToDelete );
1132 			delete pToDelete;
1133 		}
1134 		else
1135 			pElementIter++;
1136 	}
1137 
1138 	// there should be no more deleted elements
1139 	for ( pElementIter = m_aChildrenList.begin(); pElementIter != m_aChildrenList.end(); pElementIter++ )
1140     {
1141 		// if it is a 'duplicate commit' inserted elements must be really inserted to package later
1142 		// since thay can conflict with renamed elements
1143 
1144 		if ( !(*pElementIter)->m_bIsInserted )
1145 		{
1146 			// for now stream is opened in direct mode that means that in case
1147 			// storage is commited all the streams from it are commited in current state.
1148 			// following two steps are separated to allow easily implement transacted mode
1149 			// for streams if we need it in future.
1150 			// Only hierarchical access uses transacted streams currently
1151 			if ( !(*pElementIter)->m_bIsStorage && (*pElementIter)->m_pStream
1152 			  && !(*pElementIter)->m_pStream->IsTransacted() )
1153 				(*pElementIter)->m_pStream->Commit();
1154 
1155 			// if the storage was not open, there is no need to commit it ???
1156 			// the storage should be checked that it is commited
1157 			if ( (*pElementIter)->m_bIsStorage && (*pElementIter)->m_pStorage && (*pElementIter)->m_pStorage->m_bCommited )
1158 			{
1159 				// it's temporary PackageFolder should be inserted instead of current one
1160 				// also the new copy of PackageFolder should be used by the children storages
1161 
1162 				// the renamed elements are not in new temporary storage
1163 				if ( m_bCommited || m_bIsRoot )
1164 					xNewPackageFolder->removeByName( (*pElementIter)->m_aOriginalName );
1165 
1166 				(*pElementIter)->m_pStorage->InsertIntoPackageFolder( (*pElementIter)->m_aName, xNewPackageFolder );
1167 			}
1168 			else if ( !(*pElementIter)->m_bIsStorage && (*pElementIter)->m_pStream && (*pElementIter)->m_pStream->m_bFlushed )
1169 			{
1170 				if ( m_nStorageType == embed::StorageFormats::OFOPXML )
1171 					CommitStreamRelInfo( *pElementIter );
1172 
1173 				// the renamed elements are not in new temporary storage
1174 				if ( m_bCommited || m_bIsRoot )
1175 					xNewPackageFolder->removeByName( (*pElementIter)->m_aOriginalName );
1176 
1177 				(*pElementIter)->m_pStream->InsertIntoPackageFolder( (*pElementIter)->m_aName, xNewPackageFolder );
1178 			}
1179 			else if ( !m_bCommited && !m_bIsRoot )
1180 			{
1181 				// the element must be just copied to the new temporary package folder
1182 				// the connection with the original package should not be lost just because
1183 				// the element is still refered by the folder in the original hierarchy
1184 				uno::Any aPackageElement = m_xPackageFolder->getByName( (*pElementIter)->m_aOriginalName );
1185 				xNewPackageFolder->insertByName( (*pElementIter)->m_aName, aPackageElement );
1186 			}
1187 			else if ( (*pElementIter)->m_aName.compareTo( (*pElementIter)->m_aOriginalName ) )
1188 			{
1189 				// this is the case when xNewPackageFolder refers to m_xPackageFolder
1190 				// in case the name was changed and it is not a changed storage - rename the element
1191 				uno::Reference< container::XNamed > xNamed;
1192 				uno::Any aPackageElement = xNewPackageFolder->getByName( (*pElementIter)->m_aOriginalName );
1193 				xNewPackageFolder->removeByName( (*pElementIter)->m_aOriginalName );
1194 				xNewPackageFolder->insertByName( (*pElementIter)->m_aName, aPackageElement );
1195 
1196 				if ( m_nStorageType == embed::StorageFormats::OFOPXML && !(*pElementIter)->m_bIsStorage )
1197 				{
1198 					if ( !(*pElementIter)->m_pStream )
1199 					{
1200 						OpenSubStream( *pElementIter );
1201 						if ( !(*pElementIter)->m_pStream )
1202 							throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1203 					}
1204 
1205 					CommitStreamRelInfo( *pElementIter );
1206 				}
1207 			}
1208 
1209 			(*pElementIter)->m_aOriginalName = (*pElementIter)->m_aName;
1210 		}
1211 	}
1212 
1213 	for ( pElementIter = m_aChildrenList.begin(); pElementIter != m_aChildrenList.end(); pElementIter++ )
1214     {
1215 		// now inserted elements can be inserted to the package
1216 		if ( (*pElementIter)->m_bIsInserted )
1217 		{
1218 			(*pElementIter)->m_aOriginalName = (*pElementIter)->m_aName;
1219 			uno::Reference< lang::XUnoTunnel > xNewElement;
1220 
1221 			if ( (*pElementIter)->m_bIsStorage )
1222 			{
1223 				if ( (*pElementIter)->m_pStorage->m_bCommited )
1224 				{
1225 					OSL_ENSURE( (*pElementIter)->m_pStorage, "An inserted storage is incomplete!\n" );
1226 					if ( !(*pElementIter)->m_pStorage )
1227 						throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1228 
1229 					(*pElementIter)->m_pStorage->InsertIntoPackageFolder( (*pElementIter)->m_aName, xNewPackageFolder );
1230 
1231 					(*pElementIter)->m_bIsInserted = sal_False;
1232 				}
1233 			}
1234 			else
1235 			{
1236 				OSL_ENSURE( (*pElementIter)->m_pStream, "An inserted stream is incomplete!\n" );
1237 				if ( !(*pElementIter)->m_pStream )
1238 					throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1239 
1240 				if ( !(*pElementIter)->m_pStream->IsTransacted() )
1241 					(*pElementIter)->m_pStream->Commit();
1242 
1243 				if ( (*pElementIter)->m_pStream->m_bFlushed )
1244 				{
1245 					if ( m_nStorageType == embed::StorageFormats::OFOPXML )
1246 						CommitStreamRelInfo( *pElementIter );
1247 
1248 					(*pElementIter)->m_pStream->InsertIntoPackageFolder( (*pElementIter)->m_aName, xNewPackageFolder );
1249 
1250 					(*pElementIter)->m_bIsInserted = sal_False;
1251 				}
1252 			}
1253 		}
1254 	}
1255 
1256 	if ( m_nStorageType == embed::StorageFormats::PACKAGE )
1257 	{
1258 		// move properties to the destination package folder
1259 		uno::Reference< beans::XPropertySet > xProps( xNewPackageFolder, uno::UNO_QUERY );
1260 		if ( !xProps.is() )
1261 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1262 
1263 		xProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ), uno::makeAny( m_aMediaType ) );
1264 		xProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ), uno::makeAny( m_aVersion ) );
1265 	}
1266 
1267 	if ( m_nStorageType == embed::StorageFormats::OFOPXML )
1268 		CommitRelInfo( xNewPackageFolder ); // store own relations and commit complete relations storage
1269 
1270 	if ( m_bIsRoot )
1271 	{
1272 		uno::Reference< util::XChangesBatch > xChangesBatch( m_xPackage, uno::UNO_QUERY );
1273 
1274 		OSL_ENSURE( xChangesBatch.is(), "Impossible to commit package!\n" );
1275 		if ( !xChangesBatch.is() )
1276 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1277 
1278 		try
1279 		{
1280 			xChangesBatch->commitChanges();
1281 		}
1282 		catch( lang::WrappedTargetException& r )
1283 		{
1284 			// the wrapped UseBackupException means that the target medium can be corrupted
1285 			embed::UseBackupException aException;
1286 			if ( r.TargetException >>= aException )
1287 			{
1288 				m_xStream = uno::Reference< io::XStream >();
1289 				m_xInputStream = uno::Reference< io::XInputStream >();
1290 				throw aException;
1291 			}
1292 
1293             AddLog( aException.Message );
1294             AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
1295             throw;
1296 		}
1297 	}
1298 	else if ( !m_bCommited )
1299 	{
1300 		m_xPackageFolder = xNewPackageFolder;
1301 		m_bCommited = sal_True;
1302 	}
1303 
1304 	// after commit the mediatype treated as the correct one
1305 	m_bMTFallbackUsed = sal_False;
1306 }
1307 
1308 //-----------------------------------------------
Revert()1309 void OStorage_Impl::Revert()
1310 {
1311 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1312 
1313 	if ( !( m_nStorageMode & embed::ElementModes::WRITE ) )
1314 		return; // nothing to do
1315 
1316 	// all the children must be removed
1317 	// they will be created later on demand
1318 
1319 	SotElementList_Impl::iterator pElementIter = m_aChildrenList.begin();
1320 	while (  pElementIter != m_aChildrenList.end() )
1321     {
1322 		if ( (*pElementIter)->m_bIsInserted )
1323 		{
1324 			SotElement_Impl* pToDelete = *pElementIter;
1325 
1326 			pElementIter++; // to let the iterator be valid it should be increased before removing
1327 
1328 			m_aChildrenList.remove( pToDelete );
1329 			delete pToDelete;
1330 		}
1331 		else
1332 		{
1333 			ClearElement( *pElementIter );
1334 
1335 			(*pElementIter)->m_aName = (*pElementIter)->m_aOriginalName;
1336 			(*pElementIter)->m_bIsRemoved = sal_False;
1337 
1338 			pElementIter++;
1339 		}
1340 	}
1341 
1342 	// return replaced removed elements
1343 	for ( SotElementList_Impl::iterator pDeletedIter = m_aDeletedList.begin();
1344 		  pDeletedIter != m_aDeletedList.end();
1345 		  pDeletedIter++ )
1346 	{
1347 		m_aChildrenList.push_back( (*pDeletedIter) );
1348 
1349 		ClearElement( *pDeletedIter );
1350 
1351 		(*pDeletedIter)->m_aName = (*pDeletedIter)->m_aOriginalName;
1352 		(*pDeletedIter)->m_bIsRemoved = sal_False;
1353 	}
1354 	m_aDeletedList.clear();
1355 
1356     m_bControlMediaType = sal_False;
1357     m_bControlVersion = sal_False;
1358 
1359 	GetStorageProperties();
1360 
1361 	if ( m_nStorageType == embed::StorageFormats::OFOPXML )
1362 	{
1363 		// currently the relations storage is changed only on commit
1364 		m_xNewRelInfoStream = uno::Reference< io::XInputStream >();
1365 		m_aRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >();
1366 		m_nRelInfoStatus = RELINFO_NO_INIT;
1367 	}
1368 }
1369 
1370 //-----------------------------------------------
GetCommonRootEncryptionData()1371 ::comphelper::SequenceAsHashMap OStorage_Impl::GetCommonRootEncryptionData()
1372 	throw ( packages::NoEncryptionException )
1373 {
1374 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() ) ;
1375 
1376 	if ( m_nStorageType != embed::StorageFormats::PACKAGE )
1377 		throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1378 
1379 	if ( m_bIsRoot )
1380 	{
1381 		if ( !m_bHasCommonEncryptionData )
1382 			throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1383 
1384 		return m_aCommonEncryptionData;
1385 	}
1386 	else
1387 	{
1388 		if ( !m_pParent )
1389 			throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1390 
1391 		return m_pParent->GetCommonRootEncryptionData();
1392 	}
1393 }
1394 
1395 //-----------------------------------------------
FindElement(const::rtl::OUString & rName)1396 SotElement_Impl* OStorage_Impl::FindElement( const ::rtl::OUString& rName )
1397 {
1398     OSL_ENSURE( rName.getLength(), "Name is empty!" );
1399 
1400 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1401 
1402 	ReadContents();
1403 
1404 	for ( SotElementList_Impl::iterator pElementIter = m_aChildrenList.begin();
1405 		  pElementIter != m_aChildrenList.end(); pElementIter++ )
1406     {
1407         if ( (*pElementIter)->m_aName == rName && !(*pElementIter)->m_bIsRemoved )
1408             return *pElementIter;
1409 	}
1410 
1411     return NULL;
1412 }
1413 
1414 //-----------------------------------------------
InsertStream(::rtl::OUString aName,sal_Bool bEncr)1415 SotElement_Impl* OStorage_Impl::InsertStream( ::rtl::OUString aName, sal_Bool bEncr )
1416 {
1417 	OSL_ENSURE( m_xPackage.is(), "Not possible to refer to package as to factory!\n" );
1418 	if ( !m_xPackage.is() )
1419 		throw embed::InvalidStorageException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1420 
1421 	uno::Sequence< uno::Any > aSeq( 1 );
1422 	aSeq[0] <<= sal_False;
1423 	uno::Reference< lang::XUnoTunnel > xNewElement( m_xPackage->createInstanceWithArguments( aSeq ),
1424 													uno::UNO_QUERY );
1425 
1426 	OSL_ENSURE( xNewElement.is(), "Not possible to create a new stream!\n" );
1427 	if ( !xNewElement.is() )
1428 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1429 
1430 	uno::Reference< packages::XDataSinkEncrSupport > xPackageSubStream( xNewElement, uno::UNO_QUERY );
1431 	if ( !xPackageSubStream.is() )
1432 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1433 
1434 	OSL_ENSURE( m_nStorageType == embed::StorageFormats::PACKAGE || !bEncr, "Only package storage supports encryption!\n" );
1435 	if ( m_nStorageType != embed::StorageFormats::PACKAGE && bEncr )
1436 		throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1437 
1438 	// the mode is not needed for storage stream internal implementation
1439 	SotElement_Impl* pNewElement = InsertElement( aName, sal_False );
1440 	pNewElement->m_pStream = new OWriteStream_Impl( this, xPackageSubStream, m_xPackage, m_xFactory, bEncr, m_nStorageType, sal_True );
1441 
1442 	m_aChildrenList.push_back( pNewElement );
1443 	m_bIsModified = sal_True;
1444 	m_bBroadcastModified = sal_True;
1445 
1446 	return pNewElement;
1447 }
1448 
1449 //-----------------------------------------------
InsertRawStream(::rtl::OUString aName,const uno::Reference<io::XInputStream> & xInStream)1450 SotElement_Impl* OStorage_Impl::InsertRawStream( ::rtl::OUString aName, const uno::Reference< io::XInputStream >& xInStream )
1451 {
1452 	// insert of raw stream means insert and commit
1453 	OSL_ENSURE( m_xPackage.is(), "Not possible to refer to package as to factory!\n" );
1454 	if ( !m_xPackage.is() )
1455 		throw embed::InvalidStorageException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1456 
1457 	if ( m_nStorageType != embed::StorageFormats::PACKAGE )
1458 		throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1459 
1460 	uno::Reference< io::XSeekable > xSeek( xInStream, uno::UNO_QUERY );
1461 	uno::Reference< io::XInputStream > xInStrToInsert = xSeek.is() ? xInStream :
1462 																	 GetSeekableTempCopy( xInStream, GetServiceFactory() );
1463 
1464 	uno::Sequence< uno::Any > aSeq( 1 );
1465 	aSeq[0] <<= sal_False;
1466 	uno::Reference< lang::XUnoTunnel > xNewElement( m_xPackage->createInstanceWithArguments( aSeq ),
1467 													uno::UNO_QUERY );
1468 
1469 	OSL_ENSURE( xNewElement.is(), "Not possible to create a new stream!\n" );
1470 	if ( !xNewElement.is() )
1471 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1472 
1473 	uno::Reference< packages::XDataSinkEncrSupport > xPackageSubStream( xNewElement, uno::UNO_QUERY );
1474 	if ( !xPackageSubStream.is() )
1475 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1476 
1477 	xPackageSubStream->setRawStream( xInStrToInsert );
1478 
1479 	// the mode is not needed for storage stream internal implementation
1480 	SotElement_Impl* pNewElement = InsertElement( aName, sal_False );
1481 	pNewElement->m_pStream = new OWriteStream_Impl( this, xPackageSubStream, m_xPackage, m_xFactory, sal_True, m_nStorageType, sal_False );
1482 	// the stream is inserted and must be treated as a commited one
1483 	pNewElement->m_pStream->SetToBeCommited();
1484 
1485 	m_aChildrenList.push_back( pNewElement );
1486 	m_bIsModified = sal_True;
1487 	m_bBroadcastModified = sal_True;
1488 
1489 	return pNewElement;
1490 }
1491 
1492 //-----------------------------------------------
CreateNewStorageImpl(sal_Int32 nStorageMode)1493 OStorage_Impl* OStorage_Impl::CreateNewStorageImpl( sal_Int32 nStorageMode )
1494 {
1495 	OSL_ENSURE( m_xPackage.is(), "Not possible to refer to package as to factory!\n" );
1496 	if ( !m_xPackage.is() )
1497 		throw embed::InvalidStorageException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1498 
1499 	uno::Sequence< uno::Any > aSeq( 1 );
1500 	aSeq[0] <<= sal_True;
1501 	uno::Reference< lang::XUnoTunnel > xNewElement( m_xPackage->createInstanceWithArguments( aSeq ),
1502 													uno::UNO_QUERY );
1503 
1504 	OSL_ENSURE( xNewElement.is(), "Not possible to create a new storage!\n" );
1505 	if ( !xNewElement.is() )
1506 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1507 
1508 	uno::Reference< container::XNameContainer > xPackageSubFolder( xNewElement, uno::UNO_QUERY );
1509 	if ( !xPackageSubFolder.is() )
1510 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1511 
1512 	OStorage_Impl* pResult =
1513 			new OStorage_Impl( this, nStorageMode, xPackageSubFolder, m_xPackage, m_xFactory, m_nStorageType );
1514 	pResult->m_bIsModified = sal_True;
1515 
1516 	return pResult;
1517 }
1518 
1519 //-----------------------------------------------
InsertStorage(::rtl::OUString aName,sal_Int32 nStorageMode)1520 SotElement_Impl* OStorage_Impl::InsertStorage( ::rtl::OUString aName, sal_Int32 nStorageMode )
1521 {
1522 	SotElement_Impl* pNewElement = InsertElement( aName, sal_True );
1523 
1524 	pNewElement->m_pStorage = CreateNewStorageImpl( nStorageMode );
1525 
1526 	m_aChildrenList.push_back( pNewElement );
1527 
1528 	return pNewElement;
1529 }
1530 
1531 //-----------------------------------------------
InsertElement(::rtl::OUString aName,sal_Bool bIsStorage)1532 SotElement_Impl* OStorage_Impl::InsertElement( ::rtl::OUString aName, sal_Bool bIsStorage )
1533 {
1534     OSL_ENSURE( FindElement( aName ) == NULL, "Should not try to insert existing element" );
1535 
1536 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1537 
1538     SotElement_Impl* pDeletedElm = NULL;
1539 
1540 	for ( SotElementList_Impl::iterator pElementIter = m_aChildrenList.begin();
1541 		  pElementIter != m_aChildrenList.end(); pElementIter++ )
1542     {
1543         if ( (*pElementIter)->m_aName == aName )
1544 		{
1545 			OSL_ENSURE( (*pElementIter)->m_bIsRemoved, "Try to insert an element instead of existing one!\n" );
1546 			if ( (*pElementIter)->m_bIsRemoved )
1547 			{
1548 				OSL_ENSURE( !(*pElementIter)->m_bIsInserted, "Inserted elements must be deleted immediatelly!\n" );
1549             	pDeletedElm = *pElementIter;
1550 				break;
1551 			}
1552 		}
1553     }
1554 
1555 	if ( pDeletedElm )
1556 	{
1557 		if ( pDeletedElm->m_bIsStorage )
1558 			OpenSubStorage( pDeletedElm, embed::ElementModes::READWRITE );
1559 		else
1560 			OpenSubStream( pDeletedElm );
1561 
1562         m_aChildrenList.remove( pDeletedElm );  // correct usage of list ???
1563 		m_aDeletedList.push_back( pDeletedElm );
1564 	}
1565 
1566 	// create new element
1567 	return new SotElement_Impl( aName, bIsStorage, sal_True );
1568 }
1569 
1570 //-----------------------------------------------
OpenSubStorage(SotElement_Impl * pElement,sal_Int32 nStorageMode)1571 void OStorage_Impl::OpenSubStorage( SotElement_Impl* pElement, sal_Int32 nStorageMode )
1572 {
1573 	OSL_ENSURE( pElement, "pElement is not set!\n" );
1574 	OSL_ENSURE( pElement->m_bIsStorage, "Storage flag is not set!\n" );
1575 
1576 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1577 
1578 	if ( !pElement->m_pStorage )
1579 	{
1580 		OSL_ENSURE( !pElement->m_bIsInserted, "Inserted element must be created already!\n" );
1581 
1582 		uno::Reference< lang::XUnoTunnel > xTunnel;
1583 		m_xPackageFolder->getByName( pElement->m_aOriginalName ) >>= xTunnel;
1584 		if ( !xTunnel.is() )
1585 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1586 
1587 		uno::Reference< container::XNameContainer > xPackageSubFolder( xTunnel, uno::UNO_QUERY );
1588 
1589 		OSL_ENSURE( xPackageSubFolder.is(), "Can not get XNameContainer interface from folder!\n" );
1590 
1591 		if ( !xPackageSubFolder.is() )
1592 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1593 
1594 		pElement->m_pStorage = new OStorage_Impl( this, nStorageMode, xPackageSubFolder, m_xPackage, m_xFactory, m_nStorageType );
1595 	}
1596 }
1597 
1598 //-----------------------------------------------
OpenSubStream(SotElement_Impl * pElement)1599 void OStorage_Impl::OpenSubStream( SotElement_Impl* pElement )
1600 {
1601 	OSL_ENSURE( pElement, "pElement is not set!\n" );
1602 	OSL_ENSURE( !pElement->m_bIsStorage, "Storage flag is set!\n" );
1603 
1604 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1605 
1606 	if ( !pElement->m_pStream )
1607 	{
1608 		OSL_ENSURE( !pElement->m_bIsInserted, "Inserted element must be created already!\n" );
1609 
1610 		uno::Reference< lang::XUnoTunnel > xTunnel;
1611 		m_xPackageFolder->getByName( pElement->m_aOriginalName ) >>= xTunnel;
1612 		if ( !xTunnel.is() )
1613 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1614 
1615 		uno::Reference< packages::XDataSinkEncrSupport > xPackageSubStream( xTunnel, uno::UNO_QUERY );
1616 		if ( !xPackageSubStream.is() )
1617 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1618 
1619 		// the stream can never be inserted here, because inserted stream element holds the stream till commit or destruction
1620         pElement->m_pStream = new OWriteStream_Impl( this, xPackageSubStream, m_xPackage, m_xFactory, sal_False, m_nStorageType, sal_False, GetRelInfoStreamForName( pElement->m_aOriginalName ) );
1621 	}
1622 }
1623 
1624 //-----------------------------------------------
GetElementNames()1625 uno::Sequence< ::rtl::OUString > OStorage_Impl::GetElementNames()
1626 {
1627 	::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
1628 
1629 	ReadContents();
1630 
1631 	sal_uInt32 nSize = m_aChildrenList.size();
1632 	uno::Sequence< ::rtl::OUString > aElementNames( nSize );
1633 
1634 	sal_uInt32 nInd = 0;
1635     for ( SotElementList_Impl::iterator pElementIter = m_aChildrenList.begin();
1636 		  pElementIter != m_aChildrenList.end(); pElementIter++ )
1637 	{
1638 		if ( !(*pElementIter)->m_bIsRemoved )
1639         	aElementNames[nInd++] = (*pElementIter)->m_aName;
1640 	}
1641 
1642 	aElementNames.realloc( nInd );
1643     return aElementNames;
1644 }
1645 
1646 //-----------------------------------------------
RemoveElement(SotElement_Impl * pElement)1647 void OStorage_Impl::RemoveElement( SotElement_Impl* pElement )
1648 {
1649 	OSL_ENSURE( pElement, "Element must be provided!" );
1650 
1651 	if ( !pElement )
1652 		return;
1653 
1654 	if ( (pElement->m_pStorage && ( pElement->m_pStorage->m_pAntiImpl || !pElement->m_pStorage->m_aReadOnlyWrapList.empty() ))
1655 	  || (pElement->m_pStream && ( pElement->m_pStream->m_pAntiImpl || !pElement->m_pStream->m_aInputStreamsList.empty() )) )
1656 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: Access denied
1657 
1658 	if ( pElement->m_bIsInserted )
1659 	{
1660 		m_aChildrenList.remove( pElement );
1661 		delete pElement; // ???
1662 	}
1663 	else
1664 	{
1665 		pElement->m_bIsRemoved = sal_True;
1666 		ClearElement( pElement );
1667 	}
1668 
1669 	// TODO/OFOPXML: the rel stream should be removed as well
1670 }
1671 
1672 //-----------------------------------------------
ClearElement(SotElement_Impl * pElement)1673 void OStorage_Impl::ClearElement( SotElement_Impl* pElement )
1674 {
1675 	if ( pElement->m_pStorage )
1676 	{
1677 		delete pElement->m_pStorage;
1678 		pElement->m_pStorage = NULL;
1679 	}
1680 
1681 	if ( pElement->m_pStream )
1682 	{
1683 		delete pElement->m_pStream;
1684 		pElement->m_pStream = NULL;
1685 	}
1686 }
1687 
1688 //-----------------------------------------------
CloneStreamElement(const::rtl::OUString & aStreamName,sal_Bool bEncryptionDataProvided,const::comphelper::SequenceAsHashMap & aEncryptionData,uno::Reference<io::XStream> & xTargetStream)1689 void OStorage_Impl::CloneStreamElement( const ::rtl::OUString& aStreamName,
1690 										sal_Bool bEncryptionDataProvided,
1691 										const ::comphelper::SequenceAsHashMap& aEncryptionData,
1692 										uno::Reference< io::XStream >& xTargetStream )
1693 		throw ( embed::InvalidStorageException,
1694 				lang::IllegalArgumentException,
1695 				packages::WrongPasswordException,
1696 				io::IOException,
1697 				embed::StorageWrappedTargetException,
1698 				uno::RuntimeException )
1699 {
1700     SotElement_Impl *pElement = FindElement( aStreamName );
1701     if ( !pElement )
1702     {
1703         // element does not exist, throw exception
1704 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access_denied
1705     }
1706 	else if ( pElement->m_bIsStorage )
1707 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1708 
1709 	if ( !pElement->m_pStream )
1710 		OpenSubStream( pElement );
1711 
1712 	if ( pElement->m_pStream && pElement->m_pStream->m_xPackageStream.is() )
1713     {
1714 		// the existence of m_pAntiImpl of the child is not interesting,
1715 		// the copy will be created internally
1716 
1717 		// usual copying is not applicable here, only last flushed version of the
1718 		// child stream should be used for copiing. Probably the childs m_xPackageStream
1719 		// can be used as a base of a new stream, that would be copied to result
1720 		// storage. The only problem is that some package streams can be accessed from outside
1721 		// at the same time ( now solwed by wrappers that remember own position ).
1722 
1723 		if ( bEncryptionDataProvided )
1724 			pElement->m_pStream->GetCopyOfLastCommit( xTargetStream, aEncryptionData );
1725 		else
1726 			pElement->m_pStream->GetCopyOfLastCommit( xTargetStream );
1727 	}
1728 	else
1729 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: general_error
1730 }
1731 
1732 //-----------------------------------------------
RemoveStreamRelInfo(const::rtl::OUString & aOriginalName)1733 void OStorage_Impl::RemoveStreamRelInfo( const ::rtl::OUString& aOriginalName )
1734 {
1735 	// this method should be used only in OStorage_Impl::Commit() method
1736 	// the aOriginalName can be empty, in this case the storage relation info should be removed
1737 
1738 	if ( m_nStorageType == embed::StorageFormats::OFOPXML && m_xRelStorage.is() )
1739 	{
1740 		::rtl::OUString aRelStreamName = aOriginalName;
1741 		aRelStreamName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".rels" ) );
1742 
1743 		if ( m_xRelStorage->hasByName( aRelStreamName ) )
1744 			m_xRelStorage->removeElement( aRelStreamName );
1745 	}
1746 }
1747 
1748 //-----------------------------------------------
CreateRelStorage()1749 void OStorage_Impl::CreateRelStorage()
1750 {
1751 	if ( m_nStorageType != embed::StorageFormats::OFOPXML )
1752 		return;
1753 
1754 	if ( !m_xRelStorage.is() )
1755 	{
1756 		if ( !m_pRelStorElement )
1757 		{
1758 			m_pRelStorElement = new SotElement_Impl( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ), sal_True, sal_True );
1759 			m_pRelStorElement->m_pStorage = CreateNewStorageImpl( embed::ElementModes::WRITE );
1760 			if ( m_pRelStorElement->m_pStorage )
1761 				m_pRelStorElement->m_pStorage->m_pParent = NULL; // the relation storage is completely controlled by parent
1762 		}
1763 
1764 		if ( !m_pRelStorElement->m_pStorage )
1765 			OpenSubStorage( m_pRelStorElement, embed::ElementModes::WRITE );
1766 
1767 		if ( !m_pRelStorElement->m_pStorage )
1768 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1769 
1770 		OStorage* pResultStorage = new OStorage( m_pRelStorElement->m_pStorage, sal_False );
1771 		m_xRelStorage = uno::Reference< embed::XStorage >( (embed::XStorage*) pResultStorage );
1772 	}
1773 }
1774 
1775 //-----------------------------------------------
CommitStreamRelInfo(SotElement_Impl * pStreamElement)1776 void OStorage_Impl::CommitStreamRelInfo( SotElement_Impl* pStreamElement )
1777 {
1778 	// this method should be used only in OStorage_Impl::Commit() method
1779 
1780 	// the stream element must be provided
1781 	if ( !pStreamElement )
1782 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1783 
1784 	if ( m_nStorageType == embed::StorageFormats::OFOPXML && pStreamElement->m_pStream )
1785 	{
1786 		OSL_ENSURE( pStreamElement->m_aName.getLength(), "The name must not be empty!\n" );
1787 
1788 		if ( !m_xRelStorage.is() )
1789 		{
1790 			// Create new rels storage, this is commit scenario so it must be possible
1791 			CreateRelStorage();
1792 		}
1793 
1794 		pStreamElement->m_pStream->CommitStreamRelInfo( m_xRelStorage, pStreamElement->m_aOriginalName, pStreamElement->m_aName );
1795 	}
1796 }
1797 
1798 //-----------------------------------------------
GetRelInfoStreamForName(const::rtl::OUString & aName)1799 uno::Reference< io::XInputStream > OStorage_Impl::GetRelInfoStreamForName( const ::rtl::OUString& aName )
1800 {
1801 	if ( m_nStorageType == embed::StorageFormats::OFOPXML )
1802 	{
1803 		ReadContents();
1804 		if ( m_xRelStorage.is() )
1805 		{
1806 			::rtl::OUString aRelStreamName = aName;
1807 			aRelStreamName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".rels" ) );
1808 			if ( m_xRelStorage->hasByName( aRelStreamName ) )
1809 			{
1810 				uno::Reference< io::XStream > xStream = m_xRelStorage->openStreamElement( aRelStreamName, embed::ElementModes::READ );
1811 				if ( xStream.is() )
1812 					return xStream->getInputStream();
1813 			}
1814 		}
1815 	}
1816 
1817 	return uno::Reference< io::XInputStream >();
1818 }
1819 
1820 //-----------------------------------------------
CommitRelInfo(const uno::Reference<container::XNameContainer> & xNewPackageFolder)1821 void OStorage_Impl::CommitRelInfo( const uno::Reference< container::XNameContainer >& xNewPackageFolder )
1822 {
1823 	// this method should be used only in OStorage_Impl::Commit() method
1824 	::rtl::OUString aRelsStorName( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) );
1825 
1826 	if ( !xNewPackageFolder.is() )
1827 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1828 
1829 	if ( m_nStorageType == embed::StorageFormats::OFOPXML )
1830 	{
1831 		if ( m_nRelInfoStatus == RELINFO_BROKEN || m_nRelInfoStatus == RELINFO_CHANGED_BROKEN )
1832 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1833 
1834 		if ( m_nRelInfoStatus == RELINFO_CHANGED
1835 		  || m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ
1836 		  || m_nRelInfoStatus == RELINFO_CHANGED_STREAM )
1837 		{
1838 			if ( m_nRelInfoStatus == RELINFO_CHANGED )
1839 			{
1840 				if ( m_aRelInfo.getLength() )
1841 				{
1842 					CreateRelStorage();
1843 
1844 					uno::Reference< io::XStream > xRelsStream =
1845 						m_xRelStorage->openStreamElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".rels" ) ),
1846 															embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE );
1847 
1848 					uno::Reference< io::XOutputStream > xOutStream = xRelsStream->getOutputStream();
1849 					if ( !xOutStream.is() )
1850 						throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1851 
1852 					::comphelper::OFOPXMLHelper::WriteRelationsInfoSequence( xOutStream, m_aRelInfo, m_xFactory );
1853 
1854 					// set the mediatype
1855 					uno::Reference< beans::XPropertySet > xPropSet( xRelsStream, uno::UNO_QUERY_THROW );
1856 					xPropSet->setPropertyValue(
1857 						::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ),
1858 						uno::makeAny( ::rtl::OUString(
1859 						 	RTL_CONSTASCII_USTRINGPARAM( "application/vnd.openxmlformats-package.relationships+xml" ) ) ) );
1860 
1861 					m_nRelInfoStatus = RELINFO_READ;
1862 				}
1863 				else if ( m_xRelStorage.is() )
1864 					RemoveStreamRelInfo( ::rtl::OUString() ); // remove own rel info
1865 			}
1866 			else if ( m_nRelInfoStatus == RELINFO_CHANGED_STREAM_READ
1867 		  			|| m_nRelInfoStatus == RELINFO_CHANGED_STREAM )
1868 			{
1869 				CreateRelStorage();
1870 
1871 				uno::Reference< io::XStream > xRelsStream =
1872 					m_xRelStorage->openStreamElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".rels" ) ),
1873 														embed::ElementModes::TRUNCATE | embed::ElementModes::READWRITE );
1874 
1875 				uno::Reference< io::XOutputStream > xOutputStream = xRelsStream->getOutputStream();
1876 				if ( !xOutputStream.is() )
1877 					throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
1878 
1879 				uno::Reference< io::XSeekable > xSeek( m_xNewRelInfoStream, uno::UNO_QUERY_THROW );
1880 				xSeek->seek( 0 );
1881 				::comphelper::OStorageHelper::CopyInputToOutput( m_xNewRelInfoStream, xOutputStream );
1882 
1883 				// set the mediatype
1884 				uno::Reference< beans::XPropertySet > xPropSet( xRelsStream, uno::UNO_QUERY_THROW );
1885 				xPropSet->setPropertyValue(
1886 					::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ),
1887 					uno::makeAny( ::rtl::OUString(
1888 					 	RTL_CONSTASCII_USTRINGPARAM( "application/vnd.openxmlformats-package.relationships+xml" ) ) ) );
1889 
1890 				m_xNewRelInfoStream = uno::Reference< io::XInputStream >();
1891 		  		if ( m_nRelInfoStatus == RELINFO_CHANGED_STREAM )
1892 				{
1893 					m_aRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >();
1894 					m_nRelInfoStatus = RELINFO_NO_INIT;
1895 				}
1896 				else
1897 					m_nRelInfoStatus = RELINFO_READ;
1898 			}
1899 		}
1900 
1901 		if ( m_xRelStorage.is() )
1902 		{
1903 			if ( m_xRelStorage->hasElements() )
1904 			{
1905 				uno::Reference< embed::XTransactedObject > xTrans( m_xRelStorage, uno::UNO_QUERY_THROW );
1906 				if ( xTrans.is() )
1907 					xTrans->commit();
1908 			}
1909 
1910 			if ( xNewPackageFolder.is() && xNewPackageFolder->hasByName( aRelsStorName ) )
1911 				xNewPackageFolder->removeByName( aRelsStorName );
1912 
1913 			if ( !m_xRelStorage->hasElements() )
1914 			{
1915 				// the empty relations storage should not be created
1916 				delete m_pRelStorElement;
1917 				m_pRelStorElement = NULL;
1918 				m_xRelStorage = uno::Reference< embed::XStorage >();
1919 			}
1920 			else if ( m_pRelStorElement && m_pRelStorElement->m_pStorage && xNewPackageFolder.is() )
1921 				m_pRelStorElement->m_pStorage->InsertIntoPackageFolder( aRelsStorName, xNewPackageFolder );
1922 		}
1923 	}
1924 }
1925 
1926 //=====================================================
1927 // OStorage implementation
1928 //=====================================================
1929 
1930 //-----------------------------------------------
OStorage(uno::Reference<io::XInputStream> xInputStream,sal_Int32 nMode,uno::Sequence<beans::PropertyValue> xProperties,uno::Reference<lang::XMultiServiceFactory> xFactory,sal_Int32 nStorageType)1931 OStorage::OStorage(	uno::Reference< io::XInputStream > xInputStream,
1932 					sal_Int32 nMode,
1933 					uno::Sequence< beans::PropertyValue > xProperties,
1934 					uno::Reference< lang::XMultiServiceFactory > xFactory,
1935 					sal_Int32 nStorageType )
1936 : m_pImpl( new OStorage_Impl( xInputStream, nMode, xProperties, xFactory, nStorageType ) )
1937 {
1938 	m_pImpl->m_pAntiImpl = this;
1939 	m_pData = new StorInternalData_Impl( m_pImpl->m_rMutexRef, m_pImpl->m_bIsRoot, m_pImpl->m_nStorageType, sal_False );
1940 }
1941 
1942 //-----------------------------------------------
OStorage(uno::Reference<io::XStream> xStream,sal_Int32 nMode,uno::Sequence<beans::PropertyValue> xProperties,uno::Reference<lang::XMultiServiceFactory> xFactory,sal_Int32 nStorageType)1943 OStorage::OStorage(	uno::Reference< io::XStream > xStream,
1944 					sal_Int32 nMode,
1945 					uno::Sequence< beans::PropertyValue > xProperties,
1946 					uno::Reference< lang::XMultiServiceFactory > xFactory,
1947 					sal_Int32 nStorageType )
1948 : m_pImpl( new OStorage_Impl( xStream, nMode, xProperties, xFactory, nStorageType ) )
1949 {
1950 	m_pImpl->m_pAntiImpl = this;
1951 	m_pData = new StorInternalData_Impl( m_pImpl->m_rMutexRef, m_pImpl->m_bIsRoot, m_pImpl->m_nStorageType, sal_False );
1952 }
1953 
1954 //-----------------------------------------------
OStorage(OStorage_Impl * pImpl,sal_Bool bReadOnlyWrap)1955 OStorage::OStorage(	OStorage_Impl* pImpl, sal_Bool bReadOnlyWrap )
1956 : m_pImpl( pImpl )
1957 {
1958 	// this call can be done only from OStorage_Impl implementation to create child storage
1959 	OSL_ENSURE( m_pImpl && m_pImpl->m_rMutexRef.Is(), "The provided pointer & mutex MUST NOT be empty!\n" );
1960 
1961 	m_pData = new StorInternalData_Impl( m_pImpl->m_rMutexRef, m_pImpl->m_bIsRoot, m_pImpl->m_nStorageType, bReadOnlyWrap );
1962 
1963 	OSL_ENSURE( ( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE ) == embed::ElementModes::WRITE ||
1964 					m_pData->m_bReadOnlyWrap,
1965 				"The wrapper can not allow writing in case implementation does not!\n" );
1966 
1967 	if ( !bReadOnlyWrap )
1968 		m_pImpl->m_pAntiImpl = this;
1969 }
1970 
1971 //-----------------------------------------------
~OStorage()1972 OStorage::~OStorage()
1973 {
1974 	{
1975 		::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
1976 		if ( m_pImpl )
1977 		{
1978 			m_refCount++; // to call dispose
1979 			try {
1980 				dispose();
1981 			}
1982 			catch( uno::RuntimeException& aRuntimeException )
1983 			{
1984                 m_pImpl->AddLog( aRuntimeException.Message );
1985                 m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Handled exception" ) ) );
1986             }
1987 		}
1988 	}
1989 
1990 	if ( m_pData )
1991 	{
1992 		if ( m_pData->m_pSubElDispListener )
1993 		{
1994 			m_pData->m_pSubElDispListener->release();
1995 			m_pData->m_pSubElDispListener = NULL;
1996 		}
1997 
1998 		if ( m_pData->m_pTypeCollection )
1999 		{
2000 			delete m_pData->m_pTypeCollection;
2001 			m_pData->m_pTypeCollection = NULL;
2002 		}
2003 
2004 		delete m_pData;
2005 	}
2006 }
2007 
2008 //-----------------------------------------------
InternalDispose(sal_Bool bNotifyImpl)2009 void SAL_CALL OStorage::InternalDispose( sal_Bool bNotifyImpl )
2010 {
2011 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::InternalDispose" );
2012 
2013 	if ( !m_pImpl )
2014     {
2015         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2016         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2017     }
2018 
2019 	// the source object is also a kind of locker for the current object
2020 	// since the listeners could dispose the object while being notified
2021    	lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) );
2022 	m_pData->m_aListenersContainer.disposeAndClear( aSource );
2023 
2024 	if ( m_pData->m_bReadOnlyWrap )
2025 	{
2026 		OSL_ENSURE( !m_pData->m_aOpenSubComponentsList.size() || m_pData->m_pSubElDispListener,
2027 					"If any subelements are open the listener must exist!\n" );
2028 
2029 		if ( m_pData->m_pSubElDispListener )
2030 		{
2031 			m_pData->m_pSubElDispListener->OwnerIsDisposed();
2032 
2033 			// iterate through m_pData->m_aOpenSubComponentsList
2034 			// deregister m_pData->m_pSubElDispListener and dispose all of them
2035 			if ( !m_pData->m_aOpenSubComponentsList.empty() )
2036 			{
2037 				for ( WeakComponentList::iterator pCompIter = m_pData->m_aOpenSubComponentsList.begin();
2038 				  	pCompIter != m_pData->m_aOpenSubComponentsList.end(); pCompIter++ )
2039 				{
2040 					uno::Reference< lang::XComponent > xTmp = (*pCompIter);
2041 					if ( xTmp.is() )
2042 					{
2043 						xTmp->removeEventListener( uno::Reference< lang::XEventListener >(
2044 									static_cast< lang::XEventListener* >( m_pData->m_pSubElDispListener ) ) );
2045 
2046 						try {
2047 							xTmp->dispose();
2048 						} catch( uno::Exception& aException )
2049                         {
2050                             m_pImpl->AddLog( aException.Message );
2051                             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Quiet exception" ) ) );
2052                         }
2053 					}
2054 				}
2055 
2056 				m_pData->m_aOpenSubComponentsList.clear();
2057 			}
2058 		}
2059 
2060 		if ( bNotifyImpl )
2061 			m_pImpl->RemoveReadOnlyWrap( *this );
2062 	}
2063 	else
2064 	{
2065 		m_pImpl->m_pAntiImpl = NULL;
2066 
2067 		if ( bNotifyImpl )
2068 		{
2069 			if ( m_pData->m_bIsRoot )
2070 				delete m_pImpl;
2071 			else
2072 			{
2073 				// the noncommited changes for the storage must be removed
2074 				m_pImpl->Revert();
2075 			}
2076 		}
2077 	}
2078 
2079 	m_pImpl = NULL;
2080 }
2081 
2082 //-----------------------------------------------
ChildIsDisposed(const uno::Reference<uno::XInterface> & xChild)2083 void OStorage::ChildIsDisposed( const uno::Reference< uno::XInterface >& xChild )
2084 {
2085 	// this method can only be called by child disposing listener
2086 
2087 	// this method must not contain any locking
2088 	// the locking is done in the listener
2089 
2090 	if ( !m_pData->m_aOpenSubComponentsList.empty() )
2091 	{
2092 		for ( WeakComponentList::iterator pCompIter = m_pData->m_aOpenSubComponentsList.begin();
2093 		  	pCompIter != m_pData->m_aOpenSubComponentsList.end(); )
2094 		{
2095 			uno::Reference< lang::XComponent > xTmp = (*pCompIter);
2096 			if ( !xTmp.is() || xTmp == xChild )
2097 			{
2098 				WeakComponentList::iterator pIterToRemove = pCompIter;
2099 				pCompIter++;
2100 				m_pData->m_aOpenSubComponentsList.erase( pIterToRemove );
2101 			}
2102 			else
2103 				pCompIter++;
2104 		}
2105 	}
2106 }
2107 
2108 //-----------------------------------------------
BroadcastModifiedIfNecessary()2109 void OStorage::BroadcastModifiedIfNecessary()
2110 {
2111 	// no need to lock mutex here for the checking of m_pImpl, and m_pData is alive until the object is destructed
2112 	if ( !m_pImpl )
2113     {
2114         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2115         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2116     }
2117 
2118 	if ( !m_pImpl->m_bBroadcastModified )
2119 		return;
2120 
2121 	m_pImpl->m_bBroadcastModified = sal_False;
2122 
2123 	OSL_ENSURE( !m_pData->m_bReadOnlyWrap, "The storage can not be modified at all!\n" );
2124 
2125    	lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) );
2126 
2127    	::cppu::OInterfaceContainerHelper* pContainer =
2128 			m_pData->m_aListenersContainer.getContainer(
2129 				::getCppuType( ( const uno::Reference< util::XModifyListener >*) NULL ) );
2130    	if ( pContainer )
2131 	{
2132        	::cppu::OInterfaceIteratorHelper pIterator( *pContainer );
2133        	while ( pIterator.hasMoreElements( ) )
2134        	{
2135            	( ( util::XModifyListener* )pIterator.next( ) )->modified( aSource );
2136        	}
2137 	}
2138 }
2139 
2140 //-----------------------------------------------
BroadcastTransaction(sal_Int8 nMessage)2141 void OStorage::BroadcastTransaction( sal_Int8 nMessage )
2142 /*
2143 	1 - preCommit
2144 	2 - commited
2145 	3 - preRevert
2146 	4 - reverted
2147 */
2148 {
2149 	// no need to lock mutex here for the checking of m_pImpl, and m_pData is alive until the object is destructed
2150 	if ( !m_pImpl )
2151     {
2152         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2153         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2154     }
2155 
2156 	OSL_ENSURE( !m_pData->m_bReadOnlyWrap, "The storage can not be modified at all!\n" );
2157 
2158    	lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) );
2159 
2160    	::cppu::OInterfaceContainerHelper* pContainer =
2161 			m_pData->m_aListenersContainer.getContainer(
2162 				::getCppuType( ( const uno::Reference< embed::XTransactionListener >*) NULL ) );
2163    	if ( pContainer )
2164 	{
2165        	::cppu::OInterfaceIteratorHelper pIterator( *pContainer );
2166        	while ( pIterator.hasMoreElements( ) )
2167        	{
2168 			OSL_ENSURE( nMessage >= 1 && nMessage <= 4, "Wrong internal notification code is used!\n" );
2169 
2170 			switch( nMessage )
2171 			{
2172 				case STOR_MESS_PRECOMMIT:
2173            			( ( embed::XTransactionListener* )pIterator.next( ) )->preCommit( aSource );
2174 					break;
2175 				case STOR_MESS_COMMITED:
2176            			( ( embed::XTransactionListener* )pIterator.next( ) )->commited( aSource );
2177 					break;
2178 				case STOR_MESS_PREREVERT:
2179            			( ( embed::XTransactionListener* )pIterator.next( ) )->preRevert( aSource );
2180 					break;
2181 				case STOR_MESS_REVERTED:
2182            			( ( embed::XTransactionListener* )pIterator.next( ) )->reverted( aSource );
2183 					break;
2184 			}
2185        	}
2186 	}
2187 }
2188 
2189 //-----------------------------------------------
OpenStreamElement_Impl(const::rtl::OUString & aStreamName,sal_Int32 nOpenMode,sal_Bool bEncr)2190 SotElement_Impl* OStorage::OpenStreamElement_Impl( const ::rtl::OUString& aStreamName, sal_Int32 nOpenMode, sal_Bool bEncr )
2191 {
2192 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
2193 
2194 	OSL_ENSURE( !m_pData->m_bReadOnlyWrap || ( nOpenMode & embed::ElementModes::WRITE ) != embed::ElementModes::WRITE,
2195 				"An element can not be opened for writing in readonly storage!\n" );
2196 
2197     SotElement_Impl *pElement = m_pImpl->FindElement( aStreamName );
2198     if ( !pElement )
2199     {
2200         // element does not exist, check if creation is allowed
2201 		if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE )
2202           || (( nOpenMode & embed::ElementModes::WRITE ) != embed::ElementModes::WRITE )
2203           || ( nOpenMode & embed::ElementModes::NOCREATE ) == embed::ElementModes::NOCREATE )
2204 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access_denied
2205 
2206         // create a new StreamElement and insert it into the list
2207 		pElement = m_pImpl->InsertStream( aStreamName, bEncr );
2208     }
2209 	else if ( pElement->m_bIsStorage )
2210 	{
2211 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2212 	}
2213 
2214 	OSL_ENSURE( pElement, "In case element can not be created an exception must be thrown!" );
2215 
2216 	if ( !pElement->m_pStream )
2217 		m_pImpl->OpenSubStream( pElement );
2218 
2219 	if ( !pElement->m_pStream )
2220 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2221 
2222 	return pElement;
2223 }
2224 
2225 //-----------------------------------------------
MakeLinkToSubComponent_Impl(const uno::Reference<lang::XComponent> & xComponent)2226 void OStorage::MakeLinkToSubComponent_Impl( const uno::Reference< lang::XComponent >& xComponent )
2227 {
2228 	if ( !xComponent.is() )
2229 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2230 
2231 	if ( !m_pData->m_pSubElDispListener )
2232 	{
2233 		m_pData->m_pSubElDispListener = new OChildDispListener_Impl( *this );
2234 		m_pData->m_pSubElDispListener->acquire();
2235 	}
2236 
2237 	xComponent->addEventListener( uno::Reference< lang::XEventListener >(
2238 		static_cast< ::cppu::OWeakObject* >( m_pData->m_pSubElDispListener ), uno::UNO_QUERY ) );
2239 
2240 	m_pData->m_aOpenSubComponentsList.push_back( xComponent );
2241 }
2242 
2243 //____________________________________________________________________________________________________
2244 //	XInterface
2245 //____________________________________________________________________________________________________
2246 
2247 //-----------------------------------------------
queryInterface(const uno::Type & rType)2248 uno::Any SAL_CALL OStorage::queryInterface( const uno::Type& rType )
2249 		throw( uno::RuntimeException )
2250 {
2251 	uno::Any aReturn;
2252 
2253 	// common interfaces
2254 	aReturn <<= ::cppu::queryInterface
2255 				(	rType
2256 				,	static_cast<lang::XTypeProvider*> ( this )
2257 				,	static_cast<embed::XStorage*> ( this )
2258 				,	static_cast<embed::XStorage2*> ( this )
2259 				,	static_cast<embed::XTransactedObject*> ( this )
2260 				,	static_cast<embed::XTransactionBroadcaster*> ( this )
2261 				,	static_cast<util::XModifiable*> ( this )
2262 				,	static_cast<container::XNameAccess*> ( this )
2263 				,	static_cast<container::XElementAccess*> ( this )
2264 				,	static_cast<lang::XComponent*> ( this )
2265 				,	static_cast<beans::XPropertySet*> ( this )
2266 				,	static_cast<embed::XOptimizedStorage*> ( this ) );
2267 
2268 	if ( aReturn.hasValue() == sal_True )
2269 		return aReturn ;
2270 
2271 	aReturn <<= ::cppu::queryInterface
2272 				(	rType
2273 				,	static_cast<embed::XHierarchicalStorageAccess*> ( this )
2274 				,	static_cast<embed::XHierarchicalStorageAccess2*> ( this ) );
2275 
2276 	if ( aReturn.hasValue() == sal_True )
2277 		return aReturn ;
2278 
2279 	if ( m_pData->m_nStorageType == embed::StorageFormats::PACKAGE )
2280 	{
2281 		if ( m_pData->m_bIsRoot )
2282 		{
2283 			aReturn <<= ::cppu::queryInterface
2284 						(	rType
2285 						,	static_cast<embed::XStorageRawAccess*> ( this )
2286 						,	static_cast<embed::XEncryptionProtectedSource*> ( this )
2287 						,	static_cast<embed::XEncryptionProtectedSource2*> ( this )
2288 						,	static_cast<embed::XEncryptionProtectedStorage*> ( this ) );
2289 		}
2290 		else
2291 		{
2292 			aReturn <<= ::cppu::queryInterface
2293 						(	rType
2294 						,	static_cast<embed::XStorageRawAccess*> ( this ) );
2295 		}
2296 	}
2297 	else if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML )
2298 	{
2299 		aReturn <<= ::cppu::queryInterface
2300 					(	rType
2301 					,	static_cast<embed::XRelationshipAccess*> ( this ) );
2302 	}
2303 
2304 	if ( aReturn.hasValue() == sal_True )
2305 		return aReturn ;
2306 
2307 	return OWeakObject::queryInterface( rType );
2308 }
2309 
2310 //-----------------------------------------------
acquire()2311 void SAL_CALL OStorage::acquire() throw()
2312 {
2313 	OWeakObject::acquire();
2314 }
2315 
2316 //-----------------------------------------------
release()2317 void SAL_CALL OStorage::release() throw()
2318 {
2319 	OWeakObject::release();
2320 }
2321 
2322 //____________________________________________________________________________________________________
2323 //	XTypeProvider
2324 //____________________________________________________________________________________________________
2325 
2326 //-----------------------------------------------
getTypes()2327 uno::Sequence< uno::Type > SAL_CALL OStorage::getTypes()
2328 		throw( uno::RuntimeException )
2329 {
2330 	if ( m_pData->m_pTypeCollection == NULL )
2331 	{
2332 		::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
2333 
2334 		if ( m_pData->m_pTypeCollection == NULL )
2335 		{
2336 			if ( m_pData->m_nStorageType == embed::StorageFormats::PACKAGE )
2337 			{
2338 				if ( m_pData->m_bIsRoot )
2339 				{
2340 					m_pData->m_pTypeCollection = new ::cppu::OTypeCollection
2341 									(	::getCppuType( ( const uno::Reference< lang::XTypeProvider >* )NULL )
2342 									,	::getCppuType( ( const uno::Reference< embed::XStorage >* )NULL )
2343 									,	::getCppuType( ( const uno::Reference< embed::XStorage2 >* )NULL )
2344 									,	::getCppuType( ( const uno::Reference< embed::XStorageRawAccess >* )NULL )
2345 									,	::getCppuType( ( const uno::Reference< embed::XTransactedObject >* )NULL )
2346 									,	::getCppuType( ( const uno::Reference< embed::XTransactionBroadcaster >* )NULL )
2347 									,	::getCppuType( ( const uno::Reference< util::XModifiable >* )NULL )
2348 									,	::getCppuType( ( const uno::Reference< embed::XEncryptionProtectedStorage >* )NULL )
2349 									,	::getCppuType( ( const uno::Reference< embed::XEncryptionProtectedSource2 >* )NULL )
2350 									,	::getCppuType( ( const uno::Reference< embed::XEncryptionProtectedSource >* )NULL )
2351 									,	::getCppuType( ( const uno::Reference< beans::XPropertySet >* )NULL ) );
2352 				}
2353 				else
2354 				{
2355 					m_pData->m_pTypeCollection = new ::cppu::OTypeCollection
2356 									(	::getCppuType( ( const uno::Reference< lang::XTypeProvider >* )NULL )
2357 									,	::getCppuType( ( const uno::Reference< embed::XStorage >* )NULL )
2358 									,	::getCppuType( ( const uno::Reference< embed::XStorage2 >* )NULL )
2359 									,	::getCppuType( ( const uno::Reference< embed::XStorageRawAccess >* )NULL )
2360 									,	::getCppuType( ( const uno::Reference< embed::XTransactedObject >* )NULL )
2361 									,	::getCppuType( ( const uno::Reference< embed::XTransactionBroadcaster >* )NULL )
2362 									,	::getCppuType( ( const uno::Reference< util::XModifiable >* )NULL )
2363 									,	::getCppuType( ( const uno::Reference< beans::XPropertySet >* )NULL ) );
2364 				}
2365 			}
2366 			else if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML )
2367 			{
2368 				m_pData->m_pTypeCollection = new ::cppu::OTypeCollection
2369 								(	::getCppuType( ( const uno::Reference< lang::XTypeProvider >* )NULL )
2370 								,	::getCppuType( ( const uno::Reference< embed::XStorage >* )NULL )
2371 								,	::getCppuType( ( const uno::Reference< embed::XTransactedObject >* )NULL )
2372 								,	::getCppuType( ( const uno::Reference< embed::XTransactionBroadcaster >* )NULL )
2373 								,	::getCppuType( ( const uno::Reference< util::XModifiable >* )NULL )
2374 								,	::getCppuType( ( const uno::Reference< embed::XRelationshipAccess >* )NULL )
2375 								,	::getCppuType( ( const uno::Reference< beans::XPropertySet >* )NULL ) );
2376 			}
2377 			else
2378 			{
2379 				m_pData->m_pTypeCollection = new ::cppu::OTypeCollection
2380 								(	::getCppuType( ( const uno::Reference< lang::XTypeProvider >* )NULL )
2381 								,	::getCppuType( ( const uno::Reference< embed::XStorage >* )NULL )
2382 								,	::getCppuType( ( const uno::Reference< embed::XTransactedObject >* )NULL )
2383 								,	::getCppuType( ( const uno::Reference< embed::XTransactionBroadcaster >* )NULL )
2384 								,	::getCppuType( ( const uno::Reference< util::XModifiable >* )NULL )
2385 								,	::getCppuType( ( const uno::Reference< beans::XPropertySet >* )NULL ) );
2386 			}
2387 		}
2388 	}
2389 
2390 	return m_pData->m_pTypeCollection->getTypes() ;
2391 }
2392 
2393 namespace { struct lcl_ImplId : public rtl::Static< ::cppu::OImplementationId, lcl_ImplId > {}; }
2394 
2395 //-----------------------------------------------
getImplementationId()2396 uno::Sequence< sal_Int8 > SAL_CALL OStorage::getImplementationId()
2397 		throw( uno::RuntimeException )
2398 {
2399     ::cppu::OImplementationId &rID = lcl_ImplId::get();
2400     return rID.getImplementationId();
2401 }
2402 
2403 //____________________________________________________________________________________________________
2404 //	XStorage
2405 //____________________________________________________________________________________________________
2406 
2407 
2408 //-----------------------------------------------
copyToStorage(const uno::Reference<embed::XStorage> & xDest)2409 void SAL_CALL OStorage::copyToStorage( const uno::Reference< embed::XStorage >& xDest )
2410 		throw ( embed::InvalidStorageException,
2411 				io::IOException,
2412 				lang::IllegalArgumentException,
2413 				embed::StorageWrappedTargetException,
2414 				uno::RuntimeException )
2415 {
2416 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::copyToStorage" );
2417 
2418 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
2419 
2420 	if ( !m_pImpl )
2421     {
2422         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2423         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2424     }
2425 
2426 	if ( !xDest.is() || xDest == uno::Reference< uno::XInterface >( static_cast< OWeakObject*> ( this ), uno::UNO_QUERY ) )
2427 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 );
2428 
2429 	try {
2430 		m_pImpl->CopyToStorage( xDest, sal_False );
2431 	}
2432 	catch( embed::InvalidStorageException& aInvalidStorageException )
2433     {
2434         m_pImpl->AddLog( aInvalidStorageException.Message );
2435         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2436         throw;
2437 	}
2438 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
2439     {
2440         m_pImpl->AddLog( aIllegalArgumentException.Message );
2441         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2442         throw;
2443 	}
2444 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
2445     {
2446         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
2447         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2448         throw;
2449 	}
2450 	catch( io::IOException& aIOException )
2451     {
2452         m_pImpl->AddLog( aIOException.Message );
2453         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2454         throw;
2455 	}
2456 	catch( uno::RuntimeException& aRuntimeException )
2457     {
2458         m_pImpl->AddLog( aRuntimeException.Message );
2459         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2460         throw;
2461 	}
2462 	catch( uno::Exception& aException )
2463 	{
2464       	m_pImpl->AddLog( aException.Message );
2465       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2466 
2467       	uno::Any aCaught( ::cppu::getCaughtException() );
2468 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't copy storage!" ) ),
2469 												 uno::Reference< io::XInputStream >(),
2470 												 aCaught );
2471 	}
2472 }
2473 
2474 //-----------------------------------------------
openStreamElement(const::rtl::OUString & aStreamName,sal_Int32 nOpenMode)2475 uno::Reference< io::XStream > SAL_CALL OStorage::openStreamElement(
2476 	const ::rtl::OUString& aStreamName, sal_Int32 nOpenMode )
2477 		throw ( embed::InvalidStorageException,
2478 				lang::IllegalArgumentException,
2479 				packages::WrongPasswordException,
2480 				io::IOException,
2481 				embed::StorageWrappedTargetException,
2482 				uno::RuntimeException )
2483 {
2484 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::openStreamElement" );
2485 
2486 	::osl::ResettableMutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
2487 
2488 	if ( !m_pImpl )
2489     {
2490         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2491         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2492     }
2493 
2494 	if ( !aStreamName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStreamName, sal_False ) )
2495 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
2496 
2497 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
2498 	  && aStreamName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
2499 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // unacceptable element name
2500 
2501 	if ( ( nOpenMode & embed::ElementModes::WRITE ) && m_pData->m_bReadOnlyWrap )
2502 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
2503 
2504 	uno::Reference< io::XStream > xResult;
2505 	try
2506 	{
2507     	SotElement_Impl *pElement = OpenStreamElement_Impl( aStreamName, nOpenMode, sal_False );
2508 		OSL_ENSURE( pElement && pElement->m_pStream, "In case element can not be created an exception must be thrown!" );
2509 
2510 		xResult = pElement->m_pStream->GetStream( nOpenMode, sal_False );
2511 		OSL_ENSURE( xResult.is(), "The method must throw exception instead of removing empty result!\n" );
2512 
2513 		if ( m_pData->m_bReadOnlyWrap )
2514 		{
2515 			// before the storage disposes the stream it must deregister itself as listener
2516 			uno::Reference< lang::XComponent > xStreamComponent( xResult, uno::UNO_QUERY );
2517 			if ( !xStreamComponent.is() )
2518 				throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2519 
2520 			MakeLinkToSubComponent_Impl( xStreamComponent );
2521 		}
2522 	}
2523 	catch( embed::InvalidStorageException& aInvalidStorageException )
2524     {
2525         m_pImpl->AddLog( aInvalidStorageException.Message );
2526         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2527         throw;
2528 	}
2529 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
2530     {
2531         m_pImpl->AddLog( aIllegalArgumentException.Message );
2532         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2533         throw;
2534 	}
2535 	catch( packages::WrongPasswordException& aWrongPasswordException )
2536     {
2537         m_pImpl->AddLog( aWrongPasswordException.Message );
2538         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2539         throw;
2540 	}
2541 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
2542     {
2543         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
2544         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2545         throw;
2546 	}
2547 	catch( io::IOException& aIOException )
2548     {
2549         m_pImpl->AddLog( aIOException.Message );
2550         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2551         throw;
2552 	}
2553 	catch( uno::RuntimeException& aRuntimeException )
2554     {
2555         m_pImpl->AddLog( aRuntimeException.Message );
2556         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2557         throw;
2558 	}
2559 	catch( uno::Exception& aException )
2560 	{
2561       	m_pImpl->AddLog( aException.Message );
2562       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2563 
2564       	uno::Any aCaught( ::cppu::getCaughtException() );
2565 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't open stream element!" ) ),
2566 												 uno::Reference< io::XInputStream >(),
2567 												 aCaught );
2568 	}
2569 
2570 	aGuard.clear();
2571 
2572 	BroadcastModifiedIfNecessary();
2573 
2574 	return xResult;
2575 }
2576 
2577 //-----------------------------------------------
openEncryptedStreamElement(const::rtl::OUString & aStreamName,sal_Int32 nOpenMode,const::rtl::OUString & aPass)2578 uno::Reference< io::XStream > SAL_CALL OStorage::openEncryptedStreamElement(
2579 	const ::rtl::OUString& aStreamName, sal_Int32 nOpenMode, const ::rtl::OUString& aPass )
2580 		throw ( embed::InvalidStorageException,
2581 				lang::IllegalArgumentException,
2582 				packages::NoEncryptionException,
2583 				packages::WrongPasswordException,
2584 				io::IOException,
2585 				embed::StorageWrappedTargetException,
2586 				uno::RuntimeException )
2587 {
2588 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::openEncryptedStreamElement" );
2589 
2590     return openEncryptedStream( aStreamName, nOpenMode, ::comphelper::OStorageHelper::CreatePackageEncryptionData( aPass ) );
2591 }
2592 
2593 //-----------------------------------------------
openStorageElement(const::rtl::OUString & aStorName,sal_Int32 nStorageMode)2594 uno::Reference< embed::XStorage > SAL_CALL OStorage::openStorageElement(
2595 			const ::rtl::OUString& aStorName, sal_Int32 nStorageMode )
2596 		throw ( embed::InvalidStorageException,
2597 				lang::IllegalArgumentException,
2598 				io::IOException,
2599 				embed::StorageWrappedTargetException,
2600 				uno::RuntimeException )
2601 {
2602 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::openStorageElement" );
2603 
2604 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
2605 
2606 	if ( !m_pImpl )
2607     {
2608         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2609         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2610     }
2611 
2612 	if ( !aStorName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStorName, sal_False ) )
2613 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
2614 
2615 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
2616 	  && aStorName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
2617 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // unacceptable storage name
2618 
2619 	if ( ( nStorageMode & embed::ElementModes::WRITE ) && m_pData->m_bReadOnlyWrap )
2620 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
2621 
2622 	if ( ( nStorageMode & embed::ElementModes::TRUNCATE )
2623 	  && !( nStorageMode & embed::ElementModes::WRITE ) )
2624 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
2625 
2626 	// it's allways possible to read written storage in this implementation
2627 	nStorageMode |= embed::ElementModes::READ;
2628 
2629 	uno::Reference< embed::XStorage > xResult;
2630 	try
2631 	{
2632     	SotElement_Impl *pElement = m_pImpl->FindElement( aStorName );
2633     	if ( !pElement )
2634     	{
2635         	// element does not exist, check if creation is allowed
2636 			if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE )
2637           	|| (( nStorageMode & embed::ElementModes::WRITE ) != embed::ElementModes::WRITE )
2638           	|| ( nStorageMode & embed::ElementModes::NOCREATE ) == embed::ElementModes::NOCREATE )
2639 				throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access_denied
2640 
2641         	// create a new StorageElement and insert it into the list
2642 			pElement = m_pImpl->InsertStorage( aStorName, nStorageMode );
2643     	}
2644 		else if ( !pElement->m_bIsStorage )
2645 		{
2646 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2647 		}
2648 		else if ( pElement->m_pStorage )
2649     	{
2650         	// storage has already been opened; it may be opened another time, if it the mode allows to do so
2651         	if ( pElement->m_pStorage->m_pAntiImpl )
2652         	{
2653 				throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access_denied
2654         	}
2655 			else if ( !pElement->m_pStorage->m_aReadOnlyWrapList.empty()
2656 					&& ( nStorageMode & embed::ElementModes::WRITE ) )
2657 			{
2658 				throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access_denied
2659 			}
2660         	else
2661         	{
2662 				// in case parent storage allows writing the readonly mode of the child storage is
2663 				// virtual, that means that it is just enough to change the flag to let it be writable
2664 				// and since there is no AntiImpl nobody should be notified about it
2665 				pElement->m_pStorage->m_nStorageMode = nStorageMode | embed::ElementModes::READ;
2666 
2667 				if ( ( nStorageMode & embed::ElementModes::TRUNCATE ) )
2668 				{
2669 					for ( SotElementList_Impl::iterator pElementIter = pElement->m_pStorage->m_aChildrenList.begin();
2670  				  		pElementIter != pElement->m_pStorage->m_aChildrenList.end(); )
2671    					{
2672 						SotElement_Impl* pElementToDel = (*pElementIter);
2673 						pElementIter++;
2674 
2675 						m_pImpl->RemoveElement( pElementToDel );
2676    					}
2677 				}
2678         	}
2679     	}
2680 
2681 		if ( !pElement->m_pStorage )
2682 			m_pImpl->OpenSubStorage( pElement, nStorageMode );
2683 
2684 		if ( !pElement->m_pStorage )
2685 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: general_error
2686 
2687 		sal_Bool bReadOnlyWrap = ( ( nStorageMode & embed::ElementModes::WRITE ) != embed::ElementModes::WRITE );
2688 		OStorage* pResultStorage = new OStorage( pElement->m_pStorage, bReadOnlyWrap );
2689 		xResult = uno::Reference< embed::XStorage >( (embed::XStorage*) pResultStorage );
2690 
2691 		if ( bReadOnlyWrap )
2692 		{
2693 			// Before this call is done the object must be refcounted already
2694 			pElement->m_pStorage->SetReadOnlyWrap( *pResultStorage );
2695 
2696 			// before the storage disposes the stream it must deregister itself as listener
2697 			uno::Reference< lang::XComponent > xStorageComponent( xResult, uno::UNO_QUERY );
2698 			if ( !xStorageComponent.is() )
2699 				throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2700 
2701 			MakeLinkToSubComponent_Impl( xStorageComponent );
2702 		}
2703 	}
2704 	catch( embed::InvalidStorageException& aInvalidStorageException )
2705     {
2706         m_pImpl->AddLog( aInvalidStorageException.Message );
2707         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2708         throw;
2709 	}
2710 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
2711     {
2712         m_pImpl->AddLog( aIllegalArgumentException.Message );
2713         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2714         throw;
2715 	}
2716 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
2717     {
2718         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
2719         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2720         throw;
2721 	}
2722 	catch( io::IOException& aIOException )
2723     {
2724         m_pImpl->AddLog( aIOException.Message );
2725         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2726         throw;
2727 	}
2728 	catch( uno::RuntimeException& aRuntimeException )
2729     {
2730         m_pImpl->AddLog( aRuntimeException.Message );
2731         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2732         throw;
2733 	}
2734 	catch( uno::Exception& aException )
2735 	{
2736       	m_pImpl->AddLog( aException.Message );
2737       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2738 
2739       	uno::Any aCaught( ::cppu::getCaughtException() );
2740 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't open storage!" ) ),
2741 												 uno::Reference< io::XInputStream >(),
2742 												 aCaught );
2743 	}
2744 
2745 	return xResult;
2746 }
2747 
2748 //-----------------------------------------------
cloneStreamElement(const::rtl::OUString & aStreamName)2749 uno::Reference< io::XStream > SAL_CALL OStorage::cloneStreamElement( const ::rtl::OUString& aStreamName )
2750 		throw ( embed::InvalidStorageException,
2751 				lang::IllegalArgumentException,
2752 				packages::WrongPasswordException,
2753 				io::IOException,
2754 				embed::StorageWrappedTargetException,
2755 				uno::RuntimeException )
2756 {
2757 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::cloneStreamElement" );
2758 
2759 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
2760 
2761 	if ( !m_pImpl )
2762     {
2763         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2764         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2765     }
2766 
2767 	if ( !aStreamName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStreamName, sal_False ) )
2768 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
2769 
2770 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
2771 	  && aStreamName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
2772 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // unacceptable storage name
2773 
2774 	try
2775 	{
2776 		uno::Reference< io::XStream > xResult;
2777 		m_pImpl->CloneStreamElement( aStreamName, sal_False, ::comphelper::SequenceAsHashMap(), xResult );
2778 		if ( !xResult.is() )
2779 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2780 		return xResult;
2781 	}
2782 	catch( embed::InvalidStorageException& aInvalidStorageException )
2783     {
2784         m_pImpl->AddLog( aInvalidStorageException.Message );
2785         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2786         throw;
2787 	}
2788 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
2789     {
2790         m_pImpl->AddLog( aIllegalArgumentException.Message );
2791         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2792         throw;
2793 	}
2794 	catch( packages::WrongPasswordException& aWrongPasswordException )
2795     {
2796         m_pImpl->AddLog( aWrongPasswordException.Message );
2797         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2798         throw;
2799 	}
2800 	catch( io::IOException& aIOException )
2801     {
2802         m_pImpl->AddLog( aIOException.Message );
2803         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2804         throw;
2805 	}
2806 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
2807     {
2808         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
2809         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2810         throw;
2811 	}
2812 	catch( uno::RuntimeException& aRuntimeException )
2813     {
2814         m_pImpl->AddLog( aRuntimeException.Message );
2815         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2816         throw;
2817 	}
2818 	catch( uno::Exception& aException )
2819 	{
2820       	m_pImpl->AddLog( aException.Message );
2821       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2822 
2823       	uno::Any aCaught( ::cppu::getCaughtException() );
2824 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't clone stream!" ) ),
2825 												 uno::Reference< io::XInputStream >(),
2826 												 aCaught );
2827 	}
2828 }
2829 
2830 //-----------------------------------------------
cloneEncryptedStreamElement(const::rtl::OUString & aStreamName,const::rtl::OUString & aPass)2831 uno::Reference< io::XStream > SAL_CALL OStorage::cloneEncryptedStreamElement(
2832 	const ::rtl::OUString& aStreamName,
2833 	const ::rtl::OUString& aPass )
2834 		throw ( embed::InvalidStorageException,
2835 				lang::IllegalArgumentException,
2836 				packages::NoEncryptionException,
2837 				packages::WrongPasswordException,
2838 				io::IOException,
2839 				embed::StorageWrappedTargetException,
2840 				uno::RuntimeException )
2841 {
2842 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::cloneEncryptedStreamElement" );
2843 
2844     return cloneEncryptedStream( aStreamName, ::comphelper::OStorageHelper::CreatePackageEncryptionData( aPass ) );
2845 }
2846 
2847 //-----------------------------------------------
copyLastCommitTo(const uno::Reference<embed::XStorage> & xTargetStorage)2848 void SAL_CALL OStorage::copyLastCommitTo(
2849 			const uno::Reference< embed::XStorage >& xTargetStorage )
2850 		throw ( embed::InvalidStorageException,
2851 				lang::IllegalArgumentException,
2852 				io::IOException,
2853 				embed::StorageWrappedTargetException,
2854 				uno::RuntimeException )
2855 {
2856 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::copyLastCommitTo" );
2857 
2858 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
2859 
2860 	if ( !m_pImpl )
2861     {
2862         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2863         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2864     }
2865 
2866 	try
2867 	{
2868 		m_pImpl->CopyLastCommitTo( xTargetStorage );
2869 	}
2870 	catch( embed::InvalidStorageException& aInvalidStorageException )
2871     {
2872         m_pImpl->AddLog( aInvalidStorageException.Message );
2873         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2874         throw;
2875 	}
2876 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
2877     {
2878         m_pImpl->AddLog( aIllegalArgumentException.Message );
2879         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2880         throw;
2881 	}
2882 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
2883     {
2884         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
2885         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2886         throw;
2887 	}
2888 	catch( io::IOException& aIOException )
2889     {
2890         m_pImpl->AddLog( aIOException.Message );
2891         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2892         throw;
2893 	}
2894 	catch( uno::RuntimeException& aRuntimeException )
2895     {
2896         m_pImpl->AddLog( aRuntimeException.Message );
2897         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2898         throw;
2899 	}
2900 	catch( uno::Exception& aException )
2901 	{
2902       	m_pImpl->AddLog( aException.Message );
2903       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2904 
2905       	uno::Any aCaught( ::cppu::getCaughtException() );
2906 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't copy last commit version!" ) ),
2907 												 uno::Reference< io::XInputStream >(),
2908 												 aCaught );
2909 	}
2910 
2911 }
2912 
2913 //-----------------------------------------------
copyStorageElementLastCommitTo(const::rtl::OUString & aStorName,const uno::Reference<embed::XStorage> & xTargetStorage)2914 void SAL_CALL OStorage::copyStorageElementLastCommitTo(
2915 			const ::rtl::OUString& aStorName,
2916 			const uno::Reference< embed::XStorage >& xTargetStorage )
2917 		throw ( embed::InvalidStorageException,
2918 				lang::IllegalArgumentException,
2919 				io::IOException,
2920 				embed::StorageWrappedTargetException,
2921 				uno::RuntimeException )
2922 {
2923 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::copyStorageElementLastCommitTo" );
2924 
2925 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
2926 
2927 	if ( !m_pImpl )
2928     {
2929         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
2930         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2931     }
2932 
2933 	if ( !aStorName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStorName, sal_False ) )
2934 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
2935 
2936 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
2937 	  && aStorName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
2938 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // unacceptable storage name
2939 
2940 	// it's allways possible to read written storage in this implementation
2941 	sal_Int32 nStorageMode = embed::ElementModes::READ;
2942 
2943 	try
2944 	{
2945     	SotElement_Impl *pElement = m_pImpl->FindElement( aStorName );
2946     	if ( !pElement )
2947     	{
2948         	// element does not exist, throw exception
2949 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access_denied
2950     	}
2951 		else if ( !pElement->m_bIsStorage )
2952 		{
2953 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
2954 		}
2955 
2956 		if ( !pElement->m_pStorage )
2957 			m_pImpl->OpenSubStorage( pElement, nStorageMode );
2958 
2959 		uno::Reference< embed::XStorage > xResult;
2960 		if ( pElement->m_pStorage )
2961     	{
2962 			// the existence of m_pAntiImpl of the child is not interesting,
2963 			// the copy will be created internally
2964 
2965 			pElement->m_pStorage->CopyLastCommitTo( xTargetStorage );
2966 		}
2967 		else
2968 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: general_error
2969 	}
2970 	catch( embed::InvalidStorageException& aInvalidStorageException )
2971     {
2972         m_pImpl->AddLog( aInvalidStorageException.Message );
2973         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2974         throw;
2975 	}
2976 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
2977     {
2978         m_pImpl->AddLog( aIllegalArgumentException.Message );
2979         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2980         throw;
2981 	}
2982 	catch( io::IOException& aIOException )
2983     {
2984         m_pImpl->AddLog( aIOException.Message );
2985         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2986         throw;
2987 	}
2988 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
2989     {
2990         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
2991         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2992         throw;
2993 	}
2994 	catch( uno::RuntimeException& aRuntimeException )
2995     {
2996         m_pImpl->AddLog( aRuntimeException.Message );
2997         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
2998         throw;
2999 	}
3000 	catch( uno::Exception& aException )
3001 	{
3002       	m_pImpl->AddLog( aException.Message );
3003       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3004 
3005       	uno::Any aCaught( ::cppu::getCaughtException() );
3006 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't copy last commit element version!" ) ),
3007 												 uno::Reference< io::XInputStream >(),
3008 												 aCaught );
3009 	}
3010 }
3011 
3012 //-----------------------------------------------
isStreamElement(const::rtl::OUString & aElementName)3013 sal_Bool SAL_CALL OStorage::isStreamElement( const ::rtl::OUString& aElementName )
3014 		throw ( embed::InvalidStorageException,
3015 				lang::IllegalArgumentException,
3016 				container::NoSuchElementException,
3017 				uno::RuntimeException )
3018 {
3019 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3020 
3021 	if ( !m_pImpl )
3022     {
3023         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3024         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3025     }
3026 
3027 	if ( !aElementName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, sal_False ) )
3028 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
3029 
3030 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
3031 	  && aElementName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
3032 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // unacceptable name
3033 
3034 	SotElement_Impl* pElement = NULL;
3035 
3036 	try
3037 	{
3038 		pElement = m_pImpl->FindElement( aElementName );
3039 	}
3040 	catch( embed::InvalidStorageException& aInvalidStorageException )
3041     {
3042         m_pImpl->AddLog( aInvalidStorageException.Message );
3043         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3044         throw;
3045 	}
3046 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3047     {
3048         m_pImpl->AddLog( aIllegalArgumentException.Message );
3049         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3050         throw;
3051 	}
3052 	catch( container::NoSuchElementException& aNoSuchElementException )
3053     {
3054         m_pImpl->AddLog( aNoSuchElementException.Message );
3055         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3056         throw;
3057 	}
3058 	catch( uno::RuntimeException& aRuntimeException )
3059     {
3060         m_pImpl->AddLog( aRuntimeException.Message );
3061         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3062         throw;
3063 	}
3064 	catch( uno::Exception& aException )
3065 	{
3066       	m_pImpl->AddLog( aException.Message );
3067       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3068 
3069       	uno::Any aCaught( ::cppu::getCaughtException() );
3070 		throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't detect whether it is a stream!" ) ),
3071 												 uno::Reference< io::XInputStream >(),
3072 												 aCaught );
3073 	}
3074 
3075 	if ( !pElement )
3076 		throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); //???
3077 
3078 	return !pElement->m_bIsStorage;
3079 }
3080 
3081 //-----------------------------------------------
isStorageElement(const::rtl::OUString & aElementName)3082 sal_Bool SAL_CALL OStorage::isStorageElement( const ::rtl::OUString& aElementName )
3083 		throw ( embed::InvalidStorageException,
3084 				lang::IllegalArgumentException,
3085 				container::NoSuchElementException,
3086 				uno::RuntimeException )
3087 {
3088 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3089 
3090 	if ( !m_pImpl )
3091     {
3092         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3093         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3094     }
3095 
3096 	if ( !aElementName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, sal_False ) )
3097 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
3098 
3099 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
3100 	  && aElementName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
3101 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 );
3102 
3103 	SotElement_Impl* pElement = NULL;
3104 
3105 	try
3106 	{
3107 		pElement = m_pImpl->FindElement( aElementName );
3108 	}
3109 	catch( embed::InvalidStorageException& aInvalidStorageException )
3110     {
3111         m_pImpl->AddLog( aInvalidStorageException.Message );
3112         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3113         throw;
3114 	}
3115 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3116     {
3117         m_pImpl->AddLog( aIllegalArgumentException.Message );
3118         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3119         throw;
3120 	}
3121 	catch( container::NoSuchElementException& aNoSuchElementException )
3122     {
3123         m_pImpl->AddLog( aNoSuchElementException.Message );
3124         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3125         throw;
3126 	}
3127 	catch( uno::RuntimeException& aRuntimeException )
3128     {
3129         m_pImpl->AddLog( aRuntimeException.Message );
3130         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3131         throw;
3132 	}
3133 	catch( uno::Exception& aException )
3134 	{
3135       	m_pImpl->AddLog( aException.Message );
3136       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3137 
3138       	uno::Any aCaught( ::cppu::getCaughtException() );
3139 		throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "can't detect whether it is a storage" ) ),
3140 												 uno::Reference< io::XInputStream >(),
3141 												 aCaught );
3142 	}
3143 
3144 	if ( !pElement )
3145 		throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); //???
3146 
3147 	return pElement->m_bIsStorage;
3148 }
3149 
3150 //-----------------------------------------------
removeElement(const::rtl::OUString & aElementName)3151 void SAL_CALL OStorage::removeElement( const ::rtl::OUString& aElementName )
3152 		throw ( embed::InvalidStorageException,
3153 				lang::IllegalArgumentException,
3154 				container::NoSuchElementException,
3155 				io::IOException,
3156 				embed::StorageWrappedTargetException,
3157 				uno::RuntimeException )
3158 {
3159 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::removeElement" );
3160 
3161 	::osl::ResettableMutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3162 
3163 	if ( !m_pImpl )
3164     {
3165         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3166         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3167     }
3168 
3169 	if ( !aElementName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, sal_False ) )
3170 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
3171 
3172 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
3173 	  && aElementName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
3174 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // TODO: unacceptable name
3175 
3176 	if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE ) )
3177 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
3178 
3179 	try
3180 	{
3181 		SotElement_Impl* pElement = m_pImpl->FindElement( aElementName );
3182 
3183 		if ( !pElement )
3184 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); //???
3185 
3186 		m_pImpl->RemoveElement( pElement );
3187 
3188 		m_pImpl->m_bIsModified = sal_True;
3189 		m_pImpl->m_bBroadcastModified = sal_True;
3190 	}
3191 	catch( embed::InvalidStorageException& aInvalidStorageException )
3192     {
3193         m_pImpl->AddLog( aInvalidStorageException.Message );
3194         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3195         throw;
3196 	}
3197 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3198     {
3199         m_pImpl->AddLog( aIllegalArgumentException.Message );
3200         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3201         throw;
3202 	}
3203 	catch( container::NoSuchElementException& aNoSuchElementException )
3204     {
3205         m_pImpl->AddLog( aNoSuchElementException.Message );
3206         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3207         throw;
3208 	}
3209 	catch( io::IOException& aIOException )
3210     {
3211         m_pImpl->AddLog( aIOException.Message );
3212         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3213         throw;
3214 	}
3215 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
3216     {
3217         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
3218         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3219         throw;
3220 	}
3221 	catch( uno::RuntimeException& aRuntimeException )
3222     {
3223         m_pImpl->AddLog( aRuntimeException.Message );
3224         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3225         throw;
3226 	}
3227 	catch( uno::Exception& aException )
3228 	{
3229       	m_pImpl->AddLog( aException.Message );
3230       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3231 
3232       	uno::Any aCaught( ::cppu::getCaughtException() );
3233 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't remove element!" ) ),
3234 												 uno::Reference< io::XInputStream >(),
3235 												 aCaught );
3236 	}
3237 
3238 	aGuard.clear();
3239 
3240 	BroadcastModifiedIfNecessary();
3241 }
3242 
3243 //-----------------------------------------------
renameElement(const::rtl::OUString & aElementName,const::rtl::OUString & aNewName)3244 void SAL_CALL OStorage::renameElement( const ::rtl::OUString& aElementName, const ::rtl::OUString& aNewName )
3245 		throw ( embed::InvalidStorageException,
3246 				lang::IllegalArgumentException,
3247 				container::NoSuchElementException,
3248 				container::ElementExistException,
3249 				io::IOException,
3250 				embed::StorageWrappedTargetException,
3251 				uno::RuntimeException )
3252 {
3253 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::renameElement" );
3254 
3255 	::osl::ResettableMutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3256 
3257 	if ( !m_pImpl )
3258     {
3259         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3260         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3261     }
3262 
3263 	if ( !aElementName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, sal_False )
3264 	  || !aNewName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aNewName, sal_False ) )
3265 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
3266 
3267 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
3268 	  && ( aElementName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) )
3269 	    || aNewName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) ) )
3270 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 ); // TODO: unacceptable element name
3271 
3272 	if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE ) )
3273 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
3274 
3275 	try
3276 	{
3277 		SotElement_Impl* pRefElement = m_pImpl->FindElement( aNewName );
3278 		if ( pRefElement )
3279 			throw container::ElementExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); //???
3280 
3281 		SotElement_Impl* pElement = m_pImpl->FindElement( aElementName );
3282 		if ( !pElement )
3283 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); //???
3284 
3285 		pElement->m_aName = aNewName;
3286 
3287 		m_pImpl->m_bIsModified = sal_True;
3288 		m_pImpl->m_bBroadcastModified = sal_True;
3289 	}
3290 	catch( embed::InvalidStorageException& aInvalidStorageException )
3291     {
3292         m_pImpl->AddLog( aInvalidStorageException.Message );
3293         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3294         throw;
3295 	}
3296 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3297     {
3298         m_pImpl->AddLog( aIllegalArgumentException.Message );
3299         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3300         throw;
3301 	}
3302 	catch( container::NoSuchElementException& aNoSuchElementException )
3303     {
3304         m_pImpl->AddLog( aNoSuchElementException.Message );
3305         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3306         throw;
3307 	}
3308 	catch( container::ElementExistException& aElementExistException )
3309     {
3310         m_pImpl->AddLog( aElementExistException.Message );
3311         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3312         throw;
3313 	}
3314 	catch( io::IOException& aIOException )
3315     {
3316         m_pImpl->AddLog( aIOException.Message );
3317         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3318         throw;
3319 	}
3320 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
3321     {
3322         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
3323         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3324         throw;
3325 	}
3326 	catch( uno::RuntimeException& aRuntimeException )
3327     {
3328         m_pImpl->AddLog( aRuntimeException.Message );
3329         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3330         throw;
3331 	}
3332 	catch( uno::Exception& aException )
3333 	{
3334       	m_pImpl->AddLog( aException.Message );
3335       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3336 
3337       	uno::Any aCaught( ::cppu::getCaughtException() );
3338 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't rename element!" ) ),
3339 												 uno::Reference< io::XInputStream >(),
3340 												 aCaught );
3341 	}
3342 
3343 	aGuard.clear();
3344 
3345 	BroadcastModifiedIfNecessary();
3346 }
3347 
3348 //-----------------------------------------------
copyElementTo(const::rtl::OUString & aElementName,const uno::Reference<embed::XStorage> & xDest,const::rtl::OUString & aNewName)3349 void SAL_CALL OStorage::copyElementTo(	const ::rtl::OUString& aElementName,
3350 										const uno::Reference< embed::XStorage >& xDest,
3351 										const ::rtl::OUString& aNewName )
3352 		throw ( embed::InvalidStorageException,
3353 				lang::IllegalArgumentException,
3354 				container::NoSuchElementException,
3355 				container::ElementExistException,
3356 				io::IOException,
3357 				embed::StorageWrappedTargetException,
3358 				uno::RuntimeException )
3359 {
3360 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::copyElementTo" );
3361 
3362 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3363 
3364 	if ( !m_pImpl )
3365     {
3366         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3367         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3368     }
3369 
3370 	if ( !aElementName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, sal_False )
3371 	  || !aNewName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aNewName, sal_False ) )
3372 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
3373 
3374 	if ( !xDest.is() )
3375 		// || xDest == uno::Reference< uno::XInterface >( static_cast< OWeakObject* >( this ), uno::UNO_QUERY ) )
3376 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 2 );
3377 
3378 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
3379 	  && ( aElementName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) )
3380 	    || aNewName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) ) )
3381 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 ); // unacceptable element name
3382 
3383 	try
3384 	{
3385 		SotElement_Impl* pElement = m_pImpl->FindElement( aElementName );
3386 		if ( !pElement )
3387 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3388 
3389 		uno::Reference< XNameAccess > xNameAccess( xDest, uno::UNO_QUERY );
3390 		if ( !xNameAccess.is() )
3391 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3392 
3393 		if ( xNameAccess->hasByName( aNewName ) )
3394 			throw container::ElementExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3395 
3396 		m_pImpl->CopyStorageElement( pElement, xDest, aNewName, sal_False );
3397 	}
3398 	catch( embed::InvalidStorageException& aInvalidStorageException )
3399     {
3400         m_pImpl->AddLog( aInvalidStorageException.Message );
3401         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3402         throw;
3403 	}
3404 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3405     {
3406         m_pImpl->AddLog( aIllegalArgumentException.Message );
3407         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3408         throw;
3409 	}
3410 	catch( container::NoSuchElementException& aNoSuchElementException )
3411     {
3412         m_pImpl->AddLog( aNoSuchElementException.Message );
3413         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3414         throw;
3415 	}
3416 	catch( container::ElementExistException& aElementExistException )
3417     {
3418         m_pImpl->AddLog( aElementExistException.Message );
3419         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3420         throw;
3421 	}
3422 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
3423     {
3424         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
3425         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3426         throw;
3427 	}
3428 	catch( io::IOException& aIOException )
3429     {
3430         m_pImpl->AddLog( aIOException.Message );
3431         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3432         throw;
3433 	}
3434 	catch( uno::RuntimeException& aRuntimeException )
3435     {
3436         m_pImpl->AddLog( aRuntimeException.Message );
3437         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3438         throw;
3439 	}
3440 	catch( uno::Exception& aException )
3441 	{
3442       	m_pImpl->AddLog( aException.Message );
3443       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3444 
3445       	uno::Any aCaught( ::cppu::getCaughtException() );
3446 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't copy element!" ) ),
3447 												 uno::Reference< io::XInputStream >(),
3448 												 aCaught );
3449 	}
3450 }
3451 
3452 
3453 //-----------------------------------------------
moveElementTo(const::rtl::OUString & aElementName,const uno::Reference<embed::XStorage> & xDest,const::rtl::OUString & aNewName)3454 void SAL_CALL OStorage::moveElementTo(	const ::rtl::OUString& aElementName,
3455 										const uno::Reference< embed::XStorage >& xDest,
3456 										const ::rtl::OUString& aNewName )
3457 		throw ( embed::InvalidStorageException,
3458 				lang::IllegalArgumentException,
3459 				container::NoSuchElementException,
3460 				container::ElementExistException,
3461 				io::IOException,
3462 				embed::StorageWrappedTargetException,
3463 				uno::RuntimeException )
3464 {
3465 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::moveElementTo" );
3466 
3467 	::osl::ResettableMutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3468 
3469 	if ( !m_pImpl )
3470     {
3471         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3472         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3473     }
3474 
3475 	if ( !aElementName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, sal_False )
3476 	  || !aNewName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aNewName, sal_False ) )
3477 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
3478 
3479 	if ( !xDest.is() || xDest == uno::Reference< uno::XInterface >( static_cast< OWeakObject* >( this ), uno::UNO_QUERY ) )
3480 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 2 );
3481 
3482 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
3483 	  && ( aElementName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) )
3484 	    || aNewName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) ) )
3485 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 ); // unacceptable element name
3486 
3487 	if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE ) )
3488 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
3489 
3490 	try
3491 	{
3492 		SotElement_Impl* pElement = m_pImpl->FindElement( aElementName );
3493 		if ( !pElement )
3494 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); //???
3495 
3496 		uno::Reference< XNameAccess > xNameAccess( xDest, uno::UNO_QUERY );
3497 		if ( !xNameAccess.is() )
3498 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3499 
3500 		if ( xNameAccess->hasByName( aNewName ) )
3501 			throw container::ElementExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3502 
3503 		m_pImpl->CopyStorageElement( pElement, xDest, aNewName, sal_False );
3504 
3505 		m_pImpl->RemoveElement( pElement );
3506 
3507 		m_pImpl->m_bIsModified = sal_True;
3508 		m_pImpl->m_bBroadcastModified = sal_True;
3509 	}
3510 	catch( embed::InvalidStorageException& aInvalidStorageException )
3511     {
3512         m_pImpl->AddLog( aInvalidStorageException.Message );
3513         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3514         throw;
3515 	}
3516 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3517     {
3518         m_pImpl->AddLog( aIllegalArgumentException.Message );
3519         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3520         throw;
3521 	}
3522 	catch( container::NoSuchElementException& aNoSuchElementException )
3523     {
3524         m_pImpl->AddLog( aNoSuchElementException.Message );
3525         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3526         throw;
3527 	}
3528 	catch( container::ElementExistException& aElementExistException )
3529     {
3530         m_pImpl->AddLog( aElementExistException.Message );
3531         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3532         throw;
3533 	}
3534 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
3535     {
3536         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
3537         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3538         throw;
3539 	}
3540 	catch( io::IOException& aIOException )
3541     {
3542         m_pImpl->AddLog( aIOException.Message );
3543         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3544         throw;
3545 	}
3546 	catch( uno::RuntimeException& aRuntimeException )
3547     {
3548         m_pImpl->AddLog( aRuntimeException.Message );
3549         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3550         throw;
3551 	}
3552 	catch( uno::Exception& aException )
3553 	{
3554       	m_pImpl->AddLog( aException.Message );
3555       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3556 
3557       	uno::Any aCaught( ::cppu::getCaughtException() );
3558 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't move element!" ) ),
3559 												 uno::Reference< io::XInputStream >(),
3560 												 aCaught );
3561 	}
3562 
3563 	aGuard.clear();
3564 
3565 	BroadcastModifiedIfNecessary();
3566 }
3567 
3568 //____________________________________________________________________________________________________
3569 //	XStorage2
3570 //____________________________________________________________________________________________________
3571 
3572 //-----------------------------------------------
openEncryptedStream(const::rtl::OUString & aStreamName,sal_Int32 nOpenMode,const uno::Sequence<beans::NamedValue> & aEncryptionData)3573 uno::Reference< io::XStream > SAL_CALL OStorage::openEncryptedStream(
3574 	const ::rtl::OUString& aStreamName, sal_Int32 nOpenMode, const uno::Sequence< beans::NamedValue >& aEncryptionData )
3575 		throw ( embed::InvalidStorageException,
3576 				lang::IllegalArgumentException,
3577 				packages::NoEncryptionException,
3578 				packages::WrongPasswordException,
3579 				io::IOException,
3580 				embed::StorageWrappedTargetException,
3581 				uno::RuntimeException )
3582 {
3583 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::openEncryptedStream" );
3584 
3585 	::osl::ResettableMutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3586 
3587 	if ( !m_pImpl )
3588     {
3589         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3590         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3591     }
3592 
3593 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
3594 		packages::NoEncryptionException();
3595 
3596 	if ( ( nOpenMode & embed::ElementModes::WRITE ) && m_pData->m_bReadOnlyWrap )
3597 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
3598 
3599 	if ( !aEncryptionData.getLength() )
3600 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 3 );
3601 
3602 	uno::Reference< io::XStream > xResult;
3603 	try
3604 	{
3605     	SotElement_Impl *pElement = OpenStreamElement_Impl( aStreamName, nOpenMode, sal_True );
3606 		OSL_ENSURE( pElement && pElement->m_pStream, "In case element can not be created an exception must be thrown!" );
3607 
3608 		xResult = pElement->m_pStream->GetStream( nOpenMode, aEncryptionData, sal_False );
3609 		OSL_ENSURE( xResult.is(), "The method must throw exception instead of removing empty result!\n" );
3610 
3611 		if ( m_pData->m_bReadOnlyWrap )
3612 		{
3613 			// before the storage disposes the stream it must deregister itself as listener
3614 			uno::Reference< lang::XComponent > xStreamComponent( xResult, uno::UNO_QUERY );
3615 			if ( !xStreamComponent.is() )
3616 				throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3617 
3618 			MakeLinkToSubComponent_Impl( xStreamComponent );
3619 		}
3620 	}
3621 	catch( embed::InvalidStorageException& aInvalidStorageException )
3622     {
3623         m_pImpl->AddLog( aInvalidStorageException.Message );
3624         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3625         throw;
3626 	}
3627 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3628     {
3629         m_pImpl->AddLog( aIllegalArgumentException.Message );
3630         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3631         throw;
3632 	}
3633 	catch( packages::NoEncryptionException& aNoEncryptionException )
3634     {
3635         m_pImpl->AddLog( aNoEncryptionException.Message );
3636         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3637         throw;
3638 	}
3639 	catch( packages::WrongPasswordException& aWrongPasswordException )
3640     {
3641         m_pImpl->AddLog( aWrongPasswordException.Message );
3642         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3643         throw;
3644 	}
3645 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
3646     {
3647         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
3648         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3649         throw;
3650 	}
3651 	catch( io::IOException& aIOException )
3652     {
3653         m_pImpl->AddLog( aIOException.Message );
3654         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3655         throw;
3656 	}
3657 	catch( uno::RuntimeException& aRuntimeException )
3658     {
3659         m_pImpl->AddLog( aRuntimeException.Message );
3660         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3661         throw;
3662 	}
3663 	catch( uno::Exception& aException )
3664 	{
3665       	m_pImpl->AddLog( aException.Message );
3666       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3667 
3668       	uno::Any aCaught( ::cppu::getCaughtException() );
3669 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't open encrypted stream stream!" ) ),
3670 												 uno::Reference< io::XInputStream >(),
3671 												 aCaught );
3672 	}
3673 
3674 	aGuard.clear();
3675 
3676 	BroadcastModifiedIfNecessary();
3677 
3678 	return xResult;
3679 }
3680 
3681 //-----------------------------------------------
cloneEncryptedStream(const::rtl::OUString & aStreamName,const uno::Sequence<beans::NamedValue> & aEncryptionData)3682 uno::Reference< io::XStream > SAL_CALL OStorage::cloneEncryptedStream(
3683 	const ::rtl::OUString& aStreamName,
3684 	const uno::Sequence< beans::NamedValue >& aEncryptionData )
3685 		throw ( embed::InvalidStorageException,
3686 				lang::IllegalArgumentException,
3687 				packages::NoEncryptionException,
3688 				packages::WrongPasswordException,
3689 				io::IOException,
3690 				embed::StorageWrappedTargetException,
3691 				uno::RuntimeException )
3692 {
3693 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::cloneEncryptedStream" );
3694 
3695 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3696 
3697 	if ( !m_pImpl )
3698     {
3699         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3700         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3701     }
3702 
3703 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
3704 		packages::NoEncryptionException();
3705 
3706 	if ( !aEncryptionData.getLength() )
3707 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 2 );
3708 
3709 	try
3710 	{
3711 		uno::Reference< io::XStream > xResult;
3712 		m_pImpl->CloneStreamElement( aStreamName, sal_True, aEncryptionData, xResult );
3713 		if ( !xResult.is() )
3714 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3715 		return xResult;
3716 	}
3717 	catch( embed::InvalidStorageException& aInvalidStorageException )
3718     {
3719         m_pImpl->AddLog( aInvalidStorageException.Message );
3720         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3721         throw;
3722 	}
3723 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3724     {
3725         m_pImpl->AddLog( aIllegalArgumentException.Message );
3726         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3727         throw;
3728 	}
3729 	catch( packages::NoEncryptionException& aNoEncryptionException )
3730     {
3731         m_pImpl->AddLog( aNoEncryptionException.Message );
3732         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3733         throw;
3734 	}
3735 	catch( packages::WrongPasswordException& aWrongPasswordException )
3736     {
3737         m_pImpl->AddLog( aWrongPasswordException.Message );
3738         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3739         throw;
3740 	}
3741 	catch( io::IOException& aIOException )
3742     {
3743         m_pImpl->AddLog( aIOException.Message );
3744         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3745         throw;
3746 	}
3747 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
3748     {
3749         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
3750         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3751         throw;
3752 	}
3753 	catch( uno::RuntimeException& aRuntimeException )
3754     {
3755         m_pImpl->AddLog( aRuntimeException.Message );
3756         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3757         throw;
3758 	}
3759 	catch( uno::Exception& aException )
3760 	{
3761       	m_pImpl->AddLog( aException.Message );
3762       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3763 
3764       	uno::Any aCaught( ::cppu::getCaughtException() );
3765 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't clone encrypted stream!" ) ),
3766 												 uno::Reference< io::XInputStream >(),
3767 												 aCaught );
3768 	}
3769 }
3770 
3771 
3772 //____________________________________________________________________________________________________
3773 //	XStorageRawAccess
3774 //____________________________________________________________________________________________________
3775 
3776 //-----------------------------------------------
getPlainRawStreamElement(const::rtl::OUString & sStreamName)3777 uno::Reference< io::XInputStream > SAL_CALL OStorage::getPlainRawStreamElement(
3778 			const ::rtl::OUString& sStreamName )
3779 		throw ( embed::InvalidStorageException,
3780 				lang::IllegalArgumentException,
3781 				container::NoSuchElementException,
3782 				io::IOException,
3783 				embed::StorageWrappedTargetException,
3784 				uno::RuntimeException )
3785 {
3786 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::getPlainRawStreamElement" );
3787 
3788 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3789 
3790 	if ( !m_pImpl )
3791     {
3792         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3793         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3794     }
3795 
3796 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML )
3797 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // the interface is not supported and must not be accessible
3798 
3799 	if ( !sStreamName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( sStreamName, sal_False ) )
3800 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
3801 
3802 	uno::Reference < io::XInputStream > xTempIn;
3803 	try
3804 	{
3805 		SotElement_Impl* pElement = m_pImpl->FindElement( sStreamName );
3806 		if ( !pElement )
3807 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3808 
3809 		if ( !pElement->m_pStream )
3810 		{
3811 			m_pImpl->OpenSubStream( pElement );
3812 			if ( !pElement->m_pStream )
3813 				throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3814 		}
3815 
3816 		uno::Reference< io::XInputStream > xRawInStream = pElement->m_pStream->GetPlainRawInStream();
3817 		if ( !xRawInStream.is() )
3818 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3819 
3820 		uno::Reference < io::XOutputStream > xTempOut(
3821 							m_pImpl->GetServiceFactory()->createInstance (
3822 									::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.TempFile" ) ) ),
3823 							uno::UNO_QUERY );
3824 		xTempIn = uno::Reference < io::XInputStream >( xTempOut, uno::UNO_QUERY );
3825 		uno::Reference < io::XSeekable > xSeek( xTempOut, uno::UNO_QUERY );
3826 
3827 		if ( !xTempOut.is() || !xTempIn.is() || !xSeek.is() )
3828 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3829 
3830 		// Copy temporary file to a new one
3831 		::comphelper::OStorageHelper::CopyInputToOutput( xRawInStream, xTempOut );
3832 		xTempOut->closeOutput();
3833 		xSeek->seek( 0 );
3834 	}
3835 	catch( embed::InvalidStorageException& aInvalidStorageException )
3836     {
3837         m_pImpl->AddLog( aInvalidStorageException.Message );
3838         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3839         throw;
3840 	}
3841 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3842     {
3843         m_pImpl->AddLog( aIllegalArgumentException.Message );
3844         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3845         throw;
3846 	}
3847 	catch( container::NoSuchElementException& aNoSuchElementException )
3848     {
3849         m_pImpl->AddLog( aNoSuchElementException.Message );
3850         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3851         throw;
3852 	}
3853 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
3854     {
3855         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
3856         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3857         throw;
3858 	}
3859 	catch( io::IOException& aIOException )
3860     {
3861         m_pImpl->AddLog( aIOException.Message );
3862         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3863         throw;
3864 	}
3865 	catch( uno::RuntimeException& aRuntimeException )
3866     {
3867         m_pImpl->AddLog( aRuntimeException.Message );
3868         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3869         throw;
3870 	}
3871 	catch( uno::Exception& aException )
3872 	{
3873       	m_pImpl->AddLog( aException.Message );
3874       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3875 
3876       	uno::Any aCaught( ::cppu::getCaughtException() );
3877 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't get plain raw stream!" ) ),
3878 												 uno::Reference< io::XInputStream >(),
3879 												 aCaught );
3880 	}
3881 
3882 	return xTempIn;
3883 }
3884 
3885 //-----------------------------------------------
getRawEncrStreamElement(const::rtl::OUString & sStreamName)3886 uno::Reference< io::XInputStream > SAL_CALL OStorage::getRawEncrStreamElement(
3887 			const ::rtl::OUString& sStreamName )
3888 		throw ( embed::InvalidStorageException,
3889 				lang::IllegalArgumentException,
3890 				packages::NoEncryptionException,
3891 				container::NoSuchElementException,
3892 				io::IOException,
3893 				embed::StorageWrappedTargetException,
3894 				uno::RuntimeException )
3895 {
3896 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::getRawEncrStreamElement" );
3897 
3898 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
3899 
3900 	if ( !m_pImpl )
3901     {
3902         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
3903         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3904     }
3905 
3906 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
3907 		throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3908 
3909 	if ( !sStreamName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( sStreamName, sal_False ) )
3910 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
3911 
3912 	uno::Reference < io::XInputStream > xTempIn;
3913 	try
3914 	{
3915 		SotElement_Impl* pElement = m_pImpl->FindElement( sStreamName );
3916 		if ( !pElement )
3917 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3918 
3919 		if ( !pElement->m_pStream )
3920 		{
3921 			m_pImpl->OpenSubStream( pElement );
3922 			if ( !pElement->m_pStream )
3923 				throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3924 		}
3925 
3926 		if ( !pElement->m_pStream->IsEncrypted() )
3927 			throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3928 
3929 		uno::Reference< io::XInputStream > xRawInStream = pElement->m_pStream->GetRawInStream();
3930 		if ( !xRawInStream.is() )
3931 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3932 
3933 		uno::Reference < io::XOutputStream > xTempOut(
3934 							m_pImpl->GetServiceFactory()->createInstance (
3935 									::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.TempFile" ) ) ),
3936 							uno::UNO_QUERY );
3937 		xTempIn = uno::Reference < io::XInputStream >( xTempOut, uno::UNO_QUERY );
3938 		uno::Reference < io::XSeekable > xSeek( xTempOut, uno::UNO_QUERY );
3939 
3940 		if ( !xTempOut.is() || !xTempIn.is() || !xSeek.is() )
3941 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
3942 
3943 		// Copy temporary file to a new one
3944 		::comphelper::OStorageHelper::CopyInputToOutput( xRawInStream, xTempOut );
3945 		xTempOut->closeOutput();
3946 		xSeek->seek( 0 );
3947 
3948 	}
3949 	catch( embed::InvalidStorageException& aInvalidStorageException )
3950     {
3951         m_pImpl->AddLog( aInvalidStorageException.Message );
3952         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3953         throw;
3954 	}
3955 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
3956     {
3957         m_pImpl->AddLog( aIllegalArgumentException.Message );
3958         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3959         throw;
3960 	}
3961 	catch( packages::NoEncryptionException& aNoEncryptionException )
3962     {
3963         m_pImpl->AddLog( aNoEncryptionException.Message );
3964         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3965         throw;
3966 	}
3967 	catch( container::NoSuchElementException& aNoSuchElementException )
3968     {
3969         m_pImpl->AddLog( aNoSuchElementException.Message );
3970         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3971         throw;
3972 	}
3973 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
3974     {
3975         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
3976         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3977         throw;
3978 	}
3979 	catch( io::IOException& aIOException )
3980     {
3981         m_pImpl->AddLog( aIOException.Message );
3982         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3983         throw;
3984 	}
3985 	catch( uno::RuntimeException& aRuntimeException )
3986     {
3987         m_pImpl->AddLog( aRuntimeException.Message );
3988         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3989         throw;
3990 	}
3991 	catch( uno::Exception& aException )
3992 	{
3993       	m_pImpl->AddLog( aException.Message );
3994       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
3995 
3996       	uno::Any aCaught( ::cppu::getCaughtException() );
3997 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't get raw stream!" ) ),
3998 												 uno::Reference< io::XInputStream >(),
3999 												 aCaught );
4000 	}
4001 
4002 	return xTempIn;
4003 }
4004 
4005 //-----------------------------------------------
insertRawEncrStreamElement(const::rtl::OUString & aStreamName,const uno::Reference<io::XInputStream> & xInStream)4006 void SAL_CALL OStorage::insertRawEncrStreamElement( const ::rtl::OUString& aStreamName,
4007 								const uno::Reference< io::XInputStream >& xInStream )
4008 		throw ( embed::InvalidStorageException,
4009 				lang::IllegalArgumentException,
4010 				packages::NoRawFormatException,
4011 				container::ElementExistException,
4012 				io::IOException,
4013 				embed::StorageWrappedTargetException,
4014 				uno::RuntimeException)
4015 {
4016 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::insertRawEncrStreamElement" );
4017 
4018 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4019 
4020 	if ( !m_pImpl )
4021     {
4022         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4023         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4024     }
4025 
4026 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
4027 		throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4028 
4029 	if ( !aStreamName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStreamName, sal_False ) )
4030 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
4031 
4032 	if ( !xInStream.is() )
4033 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 2 );
4034 
4035 	if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE ) )
4036 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
4037 
4038 	try
4039 	{
4040 		SotElement_Impl* pElement = m_pImpl->FindElement( aStreamName );
4041 		if ( pElement )
4042 			throw container::ElementExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4043 
4044 		m_pImpl->InsertRawStream( aStreamName, xInStream );
4045 	}
4046 	catch( embed::InvalidStorageException& aInvalidStorageException )
4047     {
4048         m_pImpl->AddLog( aInvalidStorageException.Message );
4049         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4050         throw;
4051 	}
4052 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
4053     {
4054         m_pImpl->AddLog( aIllegalArgumentException.Message );
4055         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4056         throw;
4057 	}
4058 	catch( packages::NoRawFormatException& aNoRawFormatException )
4059     {
4060         m_pImpl->AddLog( aNoRawFormatException.Message );
4061         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4062         throw;
4063 	}
4064 	catch( container::ElementExistException& aElementExistException )
4065     {
4066         m_pImpl->AddLog( aElementExistException.Message );
4067         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4068         throw;
4069 	}
4070 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
4071     {
4072         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
4073         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4074         throw;
4075 	}
4076 	catch( io::IOException& aIOException )
4077     {
4078         m_pImpl->AddLog( aIOException.Message );
4079         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4080         throw;
4081 	}
4082 	catch( uno::RuntimeException& aRuntimeException )
4083     {
4084         m_pImpl->AddLog( aRuntimeException.Message );
4085         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4086         throw;
4087 	}
4088 	catch( uno::Exception& aException )
4089 	{
4090       	m_pImpl->AddLog( aException.Message );
4091       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4092 
4093       	uno::Any aCaught( ::cppu::getCaughtException() );
4094 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't insert raw stream!" ) ),
4095 												 uno::Reference< io::XInputStream >(),
4096 												 aCaught );
4097 	}
4098 }
4099 
4100 //____________________________________________________________________________________________________
4101 //	XTransactedObject
4102 //____________________________________________________________________________________________________
4103 
4104 //-----------------------------------------------
commit()4105 void SAL_CALL OStorage::commit()
4106 		throw ( io::IOException,
4107 				embed::StorageWrappedTargetException,
4108 				uno::RuntimeException )
4109 {
4110 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::commit" );
4111 
4112 	uno::Reference< util::XModifiable > xParentModif;
4113 
4114 	try {
4115 		BroadcastTransaction( STOR_MESS_PRECOMMIT );
4116 
4117 		::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4118 
4119 		if ( !m_pImpl )
4120         {
4121             ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4122             throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4123         }
4124 
4125     	if ( m_pData->m_bReadOnlyWrap )
4126 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access_denied
4127 
4128 		m_pImpl->Commit(); // the root storage initiates the storing to source
4129 
4130 		// when the storage is commited the parent is modified
4131 		if ( m_pImpl->m_pParent && m_pImpl->m_pParent->m_pAntiImpl )
4132 			xParentModif = (util::XModifiable*)m_pImpl->m_pParent->m_pAntiImpl;
4133 	}
4134 	catch( io::IOException& aIOException )
4135     {
4136         m_pImpl->AddLog( aIOException.Message );
4137         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4138         throw;
4139 	}
4140 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
4141     {
4142         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
4143         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4144         throw;
4145 	}
4146 	catch( uno::RuntimeException& aRuntimeException )
4147     {
4148         m_pImpl->AddLog( aRuntimeException.Message );
4149         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4150         throw;
4151 	}
4152 	catch( uno::Exception& aException )
4153 	{
4154         m_pImpl->AddLog( aException.Message );
4155         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4156 
4157         uno::Any aCaught( ::cppu::getCaughtException() );
4158 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Problems on commit!" ) ),
4159 								  uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >( this ) ),
4160 								  aCaught );
4161 	}
4162 
4163 	setModified( sal_False );
4164 	if ( xParentModif.is() )
4165 		xParentModif->setModified( sal_True );
4166 
4167 	BroadcastTransaction( STOR_MESS_COMMITED );
4168 }
4169 
4170 //-----------------------------------------------
revert()4171 void SAL_CALL OStorage::revert()
4172 		throw ( io::IOException,
4173 				embed::StorageWrappedTargetException,
4174 				uno::RuntimeException )
4175 {
4176 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::revert" );
4177 
4178 	// the method removes all the changes done after last commit
4179 
4180 	BroadcastTransaction( STOR_MESS_PREREVERT );
4181 
4182 	::osl::ResettableMutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4183 
4184 	if ( !m_pImpl )
4185     {
4186         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4187         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4188     }
4189 
4190 	for ( SotElementList_Impl::iterator pElementIter = m_pImpl->m_aChildrenList.begin();
4191 		  pElementIter != m_pImpl->m_aChildrenList.end(); pElementIter++ )
4192 	{
4193 		if ( ((*pElementIter)->m_pStorage
4194 				&& ( (*pElementIter)->m_pStorage->m_pAntiImpl || !(*pElementIter)->m_pStorage->m_aReadOnlyWrapList.empty() ))
4195 		  || ((*pElementIter)->m_pStream
4196 		  		&& ( (*pElementIter)->m_pStream->m_pAntiImpl || !(*pElementIter)->m_pStream->m_aInputStreamsList.empty()) ) )
4197 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
4198 	}
4199 
4200 	if ( m_pData->m_bReadOnlyWrap || !m_pImpl->m_bListCreated )
4201 		return; // nothing to do
4202 
4203 	try {
4204 		m_pImpl->Revert();
4205 		m_pImpl->m_bIsModified = sal_False;
4206 		m_pImpl->m_bBroadcastModified = sal_True;
4207 	}
4208 	catch( io::IOException& aIOException )
4209     {
4210         m_pImpl->AddLog( aIOException.Message );
4211         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4212         throw;
4213 	}
4214 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
4215     {
4216         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
4217         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4218         throw;
4219 	}
4220 	catch( uno::RuntimeException& aRuntimeException )
4221     {
4222         m_pImpl->AddLog( aRuntimeException.Message );
4223         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4224         throw;
4225 	}
4226 	catch( uno::Exception& aException )
4227 	{
4228         m_pImpl->AddLog( aException.Message );
4229         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4230 
4231         uno::Any aCaught( ::cppu::getCaughtException() );
4232 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Problems on revert!" ) ),
4233 								  uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >( this ) ),
4234 								  aCaught );
4235 	}
4236 
4237 	aGuard.clear();
4238 
4239 	setModified( sal_False );
4240 	BroadcastTransaction( STOR_MESS_REVERTED );
4241 }
4242 
4243 //____________________________________________________________________________________________________
4244 //	XTransactionBroadcaster
4245 //____________________________________________________________________________________________________
4246 
4247 //-----------------------------------------------
addTransactionListener(const uno::Reference<embed::XTransactionListener> & aListener)4248 void SAL_CALL OStorage::addTransactionListener( const uno::Reference< embed::XTransactionListener >& aListener )
4249 		throw ( uno::RuntimeException )
4250 {
4251 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4252 
4253 	if ( !m_pImpl )
4254     {
4255         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4256         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4257     }
4258 
4259 	m_pData->m_aListenersContainer.addInterface( ::getCppuType((const uno::Reference< embed::XTransactionListener >*)0),
4260 												aListener );
4261 }
4262 
4263 //-----------------------------------------------
removeTransactionListener(const uno::Reference<embed::XTransactionListener> & aListener)4264 void SAL_CALL OStorage::removeTransactionListener( const uno::Reference< embed::XTransactionListener >& aListener )
4265 		throw ( uno::RuntimeException )
4266 {
4267 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4268 
4269 	if ( !m_pImpl )
4270     {
4271         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4272         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4273     }
4274 
4275 	m_pData->m_aListenersContainer.removeInterface( ::getCppuType((const uno::Reference< embed::XTransactionListener >*)0),
4276 													aListener );
4277 }
4278 
4279 //____________________________________________________________________________________________________
4280 //	XModifiable
4281 //  TODO: if there will be no demand on this interface it will be removed from implementation,
4282 //		  I do not want to remove it now since it is still possible that it will be inserted
4283 //		  to the service back.
4284 //____________________________________________________________________________________________________
4285 
4286 //-----------------------------------------------
isModified()4287 sal_Bool SAL_CALL OStorage::isModified()
4288 		throw ( uno::RuntimeException )
4289 {
4290 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4291 
4292 	if ( !m_pImpl )
4293     {
4294         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4295         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4296     }
4297 
4298 	return m_pImpl->m_bIsModified;
4299 }
4300 
4301 
4302 //-----------------------------------------------
setModified(sal_Bool bModified)4303 void SAL_CALL OStorage::setModified( sal_Bool bModified )
4304 		throw ( beans::PropertyVetoException,
4305 				uno::RuntimeException )
4306 {
4307 	::osl::ResettableMutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4308 
4309 	if ( !m_pImpl )
4310     {
4311         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4312         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4313     }
4314 
4315 	if ( m_pData->m_bReadOnlyWrap )
4316 		throw beans::PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
4317 
4318 	if ( m_pImpl->m_bIsModified != bModified )
4319 		m_pImpl->m_bIsModified = bModified;
4320 
4321 	aGuard.clear();
4322 	if ( bModified )
4323 	{
4324 		m_pImpl->m_bBroadcastModified = sal_True;
4325 		BroadcastModifiedIfNecessary();
4326 	}
4327 }
4328 
4329 //-----------------------------------------------
addModifyListener(const uno::Reference<util::XModifyListener> & aListener)4330 void SAL_CALL OStorage::addModifyListener(
4331 			const uno::Reference< util::XModifyListener >& aListener )
4332 		throw ( uno::RuntimeException )
4333 {
4334 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4335 
4336 	if ( !m_pImpl )
4337     {
4338         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4339         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4340     }
4341 
4342 	m_pData->m_aListenersContainer.addInterface(
4343 								::getCppuType( ( const uno::Reference< util::XModifyListener >* )0 ), aListener );
4344 }
4345 
4346 
4347 //-----------------------------------------------
removeModifyListener(const uno::Reference<util::XModifyListener> & aListener)4348 void SAL_CALL OStorage::removeModifyListener(
4349 			const uno::Reference< util::XModifyListener >& aListener )
4350 		throw ( uno::RuntimeException )
4351 {
4352 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4353 
4354 	if ( !m_pImpl )
4355     {
4356         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4357         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4358     }
4359 
4360 	m_pData->m_aListenersContainer.removeInterface(
4361 								::getCppuType( ( const uno::Reference< util::XModifyListener >* )0 ), aListener );
4362 }
4363 
4364 //____________________________________________________________________________________________________
4365 //	XNameAccess
4366 //____________________________________________________________________________________________________
4367 
4368 //-----------------------------------------------
getByName(const::rtl::OUString & aName)4369 uno::Any SAL_CALL OStorage::getByName( const ::rtl::OUString& aName )
4370 		throw ( container::NoSuchElementException,
4371 				lang::WrappedTargetException,
4372 				uno::RuntimeException )
4373 {
4374 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::getByName" );
4375 
4376 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4377 
4378 	if ( !m_pImpl )
4379     {
4380         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4381         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4382     }
4383 
4384 	if ( !aName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aName, sal_False ) )
4385 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
4386 
4387 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
4388 	  && aName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
4389 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // unacceptable element name
4390 
4391 	uno::Any aResult;
4392 	try
4393 	{
4394 		SotElement_Impl* pElement = m_pImpl->FindElement( aName );
4395 		if ( !pElement )
4396 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4397 
4398 		if ( pElement->m_bIsStorage )
4399 			aResult <<= openStorageElement( aName, embed::ElementModes::READ );
4400 		else
4401 			aResult <<= openStreamElement( aName, embed::ElementModes::READ );
4402 	}
4403 	catch( container::NoSuchElementException& aNoSuchElementException )
4404     {
4405         m_pImpl->AddLog( aNoSuchElementException.Message );
4406         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4407         throw;
4408 	}
4409 	catch( lang::WrappedTargetException& aWrappedTargetException )
4410     {
4411         m_pImpl->AddLog( aWrappedTargetException.Message );
4412         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4413         throw;
4414 	}
4415 	catch( uno::RuntimeException& aRuntimeException )
4416     {
4417         m_pImpl->AddLog( aRuntimeException.Message );
4418         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4419         throw;
4420 	}
4421 	catch ( uno::Exception& aException )
4422 	{
4423    		m_pImpl->AddLog( aException.Message );
4424    		m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4425 
4426    		uno::Any aCaught( ::cppu::getCaughtException() );
4427 		throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open storage!\n" ) ),
4428 											uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
4429 																				uno::UNO_QUERY ),
4430 											aCaught );
4431 	}
4432 
4433 	return aResult;
4434 }
4435 
4436 
4437 //-----------------------------------------------
getElementNames()4438 uno::Sequence< ::rtl::OUString > SAL_CALL OStorage::getElementNames()
4439 		throw ( uno::RuntimeException )
4440 {
4441 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::getElementNames" );
4442 
4443 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4444 
4445 	if ( !m_pImpl )
4446     {
4447         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4448         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4449     }
4450 
4451 	try
4452 	{
4453 		return m_pImpl->GetElementNames();
4454 	}
4455 	catch( uno::RuntimeException& aRuntimeException )
4456     {
4457         m_pImpl->AddLog( aRuntimeException.Message );
4458         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4459         throw;
4460 	}
4461 	catch ( uno::Exception& aException )
4462 	{
4463    		m_pImpl->AddLog( aException.Message );
4464    		m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4465 
4466    		uno::Any aCaught( ::cppu::getCaughtException() );
4467 		throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open storage!\n" ) ),
4468 											uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
4469 																				uno::UNO_QUERY ),
4470 											aCaught );
4471 	}
4472 }
4473 
4474 
4475 //-----------------------------------------------
hasByName(const::rtl::OUString & aName)4476 sal_Bool SAL_CALL OStorage::hasByName( const ::rtl::OUString& aName )
4477 		throw ( uno::RuntimeException )
4478 {
4479 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::hasByName" );
4480 
4481 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4482 
4483 	if ( !m_pImpl )
4484     {
4485         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4486         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4487     }
4488 
4489 	if ( !aName.getLength() )
4490 		return sal_False;
4491 
4492 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
4493 	  && aName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
4494 		return sal_False;
4495 
4496 	SotElement_Impl* pElement = NULL;
4497 	try
4498 	{
4499 		pElement = m_pImpl->FindElement( aName );
4500 	}
4501 	catch( uno::RuntimeException& aRuntimeException )
4502     {
4503         m_pImpl->AddLog( aRuntimeException.Message );
4504         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4505         throw;
4506 	}
4507 	catch ( uno::Exception& aException )
4508 	{
4509    		m_pImpl->AddLog( aException.Message );
4510    		m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4511 
4512    		uno::Any aCaught( ::cppu::getCaughtException() );
4513 		throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open storage!\n" ) ),
4514 											uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
4515 																				uno::UNO_QUERY ),
4516 											aCaught );
4517 	}
4518 
4519 	return ( pElement != NULL );
4520 }
4521 
4522 
4523 //-----------------------------------------------
getElementType()4524 uno::Type SAL_CALL OStorage::getElementType()
4525 		throw ( uno::RuntimeException )
4526 {
4527 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4528 
4529 	if ( !m_pImpl )
4530     {
4531         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4532         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4533     }
4534 
4535 	// it is a multitype container
4536 	return uno::Type();
4537 }
4538 
4539 
4540 //-----------------------------------------------
hasElements()4541 sal_Bool SAL_CALL OStorage::hasElements()
4542 		throw ( uno::RuntimeException )
4543 {
4544 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::hasElements" );
4545 
4546 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4547 
4548 	if ( !m_pImpl )
4549     {
4550         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4551         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4552     }
4553 
4554 	try
4555 	{
4556 		return ( m_pImpl->GetChildrenList().size() != 0 );
4557 	}
4558 	catch( uno::RuntimeException& aRuntimeException )
4559     {
4560         m_pImpl->AddLog( aRuntimeException.Message );
4561         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4562         throw;
4563 	}
4564 	catch ( uno::Exception& aException )
4565 	{
4566    		m_pImpl->AddLog( aException.Message );
4567    		m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4568 
4569    		uno::Any aCaught( ::cppu::getCaughtException() );
4570 		throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open storage!\n" ) ),
4571 											uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
4572 																				uno::UNO_QUERY ),
4573 											aCaught );
4574 	}
4575 }
4576 
4577 
4578 //____________________________________________________________________________________________________
4579 //	XComponent
4580 //____________________________________________________________________________________________________
4581 
4582 //-----------------------------------------------
dispose()4583 void SAL_CALL OStorage::dispose()
4584 		throw ( uno::RuntimeException )
4585 {
4586 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4587 
4588 	if ( !m_pImpl )
4589     {
4590         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4591         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4592     }
4593 
4594 	try
4595 	{
4596 		InternalDispose( sal_True );
4597 	}
4598 	catch( uno::RuntimeException& aRuntimeException )
4599     {
4600         m_pImpl->AddLog( aRuntimeException.Message );
4601         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4602         throw;
4603 	}
4604 	catch ( uno::Exception& aException )
4605 	{
4606    		m_pImpl->AddLog( aException.Message );
4607    		m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4608 
4609    		uno::Any aCaught( ::cppu::getCaughtException() );
4610 		throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open storage!\n" ) ),
4611 											uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
4612 																				uno::UNO_QUERY ),
4613 											aCaught );
4614 	}
4615 }
4616 
4617 //-----------------------------------------------
addEventListener(const uno::Reference<lang::XEventListener> & xListener)4618 void SAL_CALL OStorage::addEventListener(
4619 			const uno::Reference< lang::XEventListener >& xListener )
4620 		throw ( uno::RuntimeException )
4621 {
4622 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4623 
4624 	if ( !m_pImpl )
4625     {
4626         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4627         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4628     }
4629 
4630 	m_pData->m_aListenersContainer.addInterface(
4631 								::getCppuType( ( const uno::Reference< lang::XEventListener >* )0 ), xListener );
4632 }
4633 
4634 //-----------------------------------------------
removeEventListener(const uno::Reference<lang::XEventListener> & xListener)4635 void SAL_CALL OStorage::removeEventListener(
4636 			const uno::Reference< lang::XEventListener >& xListener )
4637 		throw ( uno::RuntimeException )
4638 {
4639 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4640 
4641 	if ( !m_pImpl )
4642     {
4643         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4644         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4645     }
4646 
4647 	m_pData->m_aListenersContainer.removeInterface(
4648 								::getCppuType( ( const uno::Reference< lang::XEventListener >* )0 ), xListener );
4649 }
4650 
4651 //____________________________________________________________________________________________________
4652 //	XEncryptionProtectedSource
4653 //____________________________________________________________________________________________________
4654 
setEncryptionPassword(const::rtl::OUString & aPass)4655 void SAL_CALL OStorage::setEncryptionPassword( const ::rtl::OUString& aPass )
4656 	throw ( uno::RuntimeException,
4657 			io::IOException )
4658 {
4659 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::setEncryptionPassword" );
4660     setEncryptionData( ::comphelper::OStorageHelper::CreatePackageEncryptionData( aPass ) );
4661 }
4662 
4663 //-----------------------------------------------
removeEncryption()4664 void SAL_CALL OStorage::removeEncryption()
4665 	throw ( uno::RuntimeException,
4666 			io::IOException )
4667 {
4668 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::removeEncryption" );
4669 
4670 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4671 
4672 	if ( !m_pImpl )
4673     {
4674         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4675         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4676     }
4677 
4678 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
4679 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // the interface must be visible only for package storage
4680 
4681 	OSL_ENSURE( m_pData->m_bIsRoot, "removeEncryption() method is not available for nonroot storages!\n" );
4682 	if ( m_pData->m_bIsRoot )
4683 	{
4684 		try {
4685 			m_pImpl->ReadContents();
4686 		}
4687 		catch ( uno::RuntimeException& aRuntimeException )
4688         {
4689             m_pImpl->AddLog( aRuntimeException.Message );
4690             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4691             throw;
4692 		}
4693 		catch ( uno::Exception& aException )
4694         {
4695             m_pImpl->AddLog( aException.Message );
4696             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4697 
4698         	uno::Any aCaught( ::cppu::getCaughtException() );
4699 			throw lang::WrappedTargetRuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open package!\n" ) ),
4700 												uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
4701 																					uno::UNO_QUERY ),
4702 												aCaught );
4703 		}
4704 
4705 		// TODO: check if the password is valid
4706 		// update all streams that was encrypted with old password
4707 
4708 		uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW );
4709 		try
4710 		{
4711 			xPackPropSet->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( STORAGE_ENCRYPTION_KEYS_PROPERTY ) ),
4712 											uno::makeAny( uno::Sequence< beans::NamedValue >() ) );
4713 
4714 			m_pImpl->m_bHasCommonEncryptionData = sal_False;
4715 			m_pImpl->m_aCommonEncryptionData.clear();
4716 		}
4717         catch( uno::RuntimeException& aRException )
4718         {
4719             m_pImpl->AddLog( aRException.Message );
4720             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4721 
4722 			OSL_ENSURE( sal_False, "The call must not fail, it is pretty simple!" );
4723 			throw;
4724         }
4725 		catch( uno::Exception& aException )
4726 		{
4727             m_pImpl->AddLog( aException.Message );
4728             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4729 
4730 			OSL_ENSURE( sal_False, "The call must not fail, it is pretty simple!" );
4731 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4732 		}
4733 	}
4734 }
4735 
4736 //____________________________________________________________________________________________________
4737 //	XEncryptionProtectedSource2
4738 //____________________________________________________________________________________________________
4739 
setEncryptionData(const uno::Sequence<beans::NamedValue> & aEncryptionData)4740 void SAL_CALL OStorage::setEncryptionData( const uno::Sequence< beans::NamedValue >& aEncryptionData )
4741     throw ( io::IOException,
4742             uno::RuntimeException )
4743 {
4744 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::setEncryptionData" );
4745 
4746 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4747 
4748 	if ( !m_pImpl )
4749     {
4750         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4751         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4752     }
4753 
4754 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
4755 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // the interface must be visible only for package storage
4756 
4757     if ( !aEncryptionData.getLength() )
4758 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected empty encryption data!") ), uno::Reference< uno::XInterface >() );
4759 
4760 	OSL_ENSURE( m_pData->m_bIsRoot, "setEncryptionData() method is not available for nonroot storages!\n" );
4761 	if ( m_pData->m_bIsRoot )
4762 	{
4763 		try {
4764 			m_pImpl->ReadContents();
4765 		}
4766 		catch ( uno::RuntimeException& aRuntimeException )
4767         {
4768             m_pImpl->AddLog( aRuntimeException.Message );
4769             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4770             throw;
4771 		}
4772 		catch ( uno::Exception& aException )
4773         {
4774             m_pImpl->AddLog( aException.Message );
4775             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4776 
4777         	uno::Any aCaught( ::cppu::getCaughtException() );
4778 			throw lang::WrappedTargetRuntimeException(
4779                                 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open package!\n" ) ),
4780 								uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ), uno::UNO_QUERY ),
4781 								aCaught );
4782 		}
4783 
4784 		uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW );
4785 		try
4786 		{
4787             ::comphelper::SequenceAsHashMap aEncryptionMap( aEncryptionData );
4788 			xPackPropSet->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( STORAGE_ENCRYPTION_KEYS_PROPERTY ) ),
4789 											uno::makeAny( aEncryptionMap.getAsConstNamedValueList() ) );
4790 
4791 			m_pImpl->m_bHasCommonEncryptionData = sal_True;
4792 			m_pImpl->m_aCommonEncryptionData = aEncryptionMap;
4793 		}
4794 		catch( uno::Exception& aException )
4795 		{
4796             m_pImpl->AddLog( aException.Message );
4797             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4798 
4799 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4800 		}
4801 	}
4802 }
4803 
4804 //____________________________________________________________________________________________________
4805 //	XEncryptionProtectedStorage
4806 //____________________________________________________________________________________________________
4807 
4808 //-----------------------------------------------
setEncryptionAlgorithms(const uno::Sequence<beans::NamedValue> & aAlgorithms)4809 void SAL_CALL OStorage::setEncryptionAlgorithms( const uno::Sequence< beans::NamedValue >& aAlgorithms )
4810     throw (lang::IllegalArgumentException, uno::RuntimeException)
4811 {
4812 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::setEncryptionAlgorithms" );
4813 
4814 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4815 
4816 	if ( !m_pImpl )
4817     {
4818         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4819         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4820     }
4821 
4822 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
4823 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // the interface must be visible only for package storage
4824 
4825     if ( !aAlgorithms.getLength() )
4826 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected empty encryption algorithms list!") ), uno::Reference< uno::XInterface >() );
4827 
4828 	OSL_ENSURE( m_pData->m_bIsRoot, "setEncryptionAlgorithms() method is not available for nonroot storages!\n" );
4829 	if ( m_pData->m_bIsRoot )
4830 	{
4831 		try {
4832 			m_pImpl->ReadContents();
4833 		}
4834 		catch ( uno::RuntimeException& aRuntimeException )
4835         {
4836             m_pImpl->AddLog( aRuntimeException.Message );
4837             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4838             throw;
4839 		}
4840 		catch ( uno::Exception& aException )
4841         {
4842             m_pImpl->AddLog( aException.Message );
4843             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4844 
4845         	uno::Any aCaught( ::cppu::getCaughtException() );
4846 			throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open package!\n" ) ),
4847 												uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
4848 																					uno::UNO_QUERY ),
4849 												aCaught );
4850 		}
4851 
4852 		uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW );
4853 		try
4854 		{
4855 			xPackPropSet->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ENCRYPTION_ALGORITHMS_PROPERTY ) ),
4856 											uno::makeAny( aAlgorithms ) );
4857 		}
4858 		catch ( uno::RuntimeException& aRuntimeException )
4859         {
4860             m_pImpl->AddLog( aRuntimeException.Message );
4861             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4862             throw;
4863 		}
4864         catch( lang::IllegalArgumentException& aIAException )
4865         {
4866             m_pImpl->AddLog( aIAException.Message );
4867             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4868 
4869             throw;
4870         }
4871 		catch( uno::Exception& aException )
4872 		{
4873             m_pImpl->AddLog( aException.Message );
4874             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4875 
4876 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4877 		}
4878     }
4879 }
4880 
4881 //-----------------------------------------------
getEncryptionAlgorithms()4882 uno::Sequence< beans::NamedValue > SAL_CALL OStorage::getEncryptionAlgorithms()
4883     throw (uno::RuntimeException)
4884 {
4885 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::getEncryptionAlgorithms" );
4886 
4887 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4888 
4889 	if ( !m_pImpl )
4890     {
4891         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4892         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4893     }
4894 
4895 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
4896 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // the interface must be visible only for package storage
4897 
4898     uno::Sequence< beans::NamedValue > aResult;
4899 	OSL_ENSURE( m_pData->m_bIsRoot, "getEncryptionAlgorithms() method is not available for nonroot storages!\n" );
4900 	if ( m_pData->m_bIsRoot )
4901 	{
4902 		try {
4903 			m_pImpl->ReadContents();
4904 		}
4905 		catch ( uno::RuntimeException& aRuntimeException )
4906         {
4907             m_pImpl->AddLog( aRuntimeException.Message );
4908             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4909             throw;
4910 		}
4911 		catch ( uno::Exception& aException )
4912         {
4913             m_pImpl->AddLog( aException.Message );
4914             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4915 
4916         	uno::Any aCaught( ::cppu::getCaughtException() );
4917 			throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open package!\n" ) ),
4918 												uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
4919 																					uno::UNO_QUERY ),
4920 												aCaught );
4921 		}
4922 
4923 		uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY_THROW );
4924 		try
4925 		{
4926 			xPackPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ENCRYPTION_ALGORITHMS_PROPERTY ) ) ) >>= aResult;
4927 		}
4928 		catch ( uno::RuntimeException& aRuntimeException )
4929         {
4930             m_pImpl->AddLog( aRuntimeException.Message );
4931             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4932             throw;
4933 		}
4934 		catch( uno::Exception& aException )
4935 		{
4936             m_pImpl->AddLog( aException.Message );
4937             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
4938 
4939 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4940 		}
4941     }
4942 
4943     return aResult;
4944 }
4945 
4946 
4947 //____________________________________________________________________________________________________
4948 //	XPropertySet
4949 //____________________________________________________________________________________________________
4950 
4951 //-----------------------------------------------
getPropertySetInfo()4952 uno::Reference< beans::XPropertySetInfo > SAL_CALL OStorage::getPropertySetInfo()
4953 		throw ( uno::RuntimeException )
4954 {
4955 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4956 
4957 	if ( !m_pImpl )
4958     {
4959         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4960         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4961     }
4962 
4963 	//TODO:
4964 	return uno::Reference< beans::XPropertySetInfo >();
4965 }
4966 
4967 
4968 //-----------------------------------------------
setPropertyValue(const::rtl::OUString & aPropertyName,const uno::Any & aValue)4969 void SAL_CALL OStorage::setPropertyValue( const ::rtl::OUString& aPropertyName, const uno::Any& aValue )
4970 		throw ( beans::UnknownPropertyException,
4971 				beans::PropertyVetoException,
4972 				lang::IllegalArgumentException,
4973 				lang::WrappedTargetException,
4974 				uno::RuntimeException )
4975 {
4976 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::setPropertyValue" );
4977 
4978 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
4979 
4980 	if ( !m_pImpl )
4981     {
4982         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
4983         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4984     }
4985 
4986 	//TODO: think about interaction handler
4987 
4988     // WORKAROUND:
4989     // The old document might have no version in the manifest.xml, so we have to allow to set the version
4990     // even for readonly storages, so that the version from content.xml can be used.
4991 	if ( m_pData->m_bReadOnlyWrap && !aPropertyName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) ) )
4992 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: Access denied
4993 
4994 	if ( m_pData->m_nStorageType == embed::StorageFormats::ZIP )
4995 		throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
4996 	else if ( m_pData->m_nStorageType == embed::StorageFormats::PACKAGE )
4997 	{
4998 		if ( aPropertyName.equalsAscii( "MediaType" ) )
4999 		{
5000 			aValue >>= m_pImpl->m_aMediaType;
5001 			m_pImpl->m_bControlMediaType = sal_True;
5002 
5003             m_pImpl->m_bBroadcastModified = sal_True;
5004             m_pImpl->m_bIsModified = sal_True;
5005 		}
5006 		else if ( aPropertyName.equalsAscii( "Version" ) )
5007 		{
5008 			aValue >>= m_pImpl->m_aVersion;
5009 			m_pImpl->m_bControlVersion = sal_True;
5010 
5011             // this property can be set even for readonly storage
5012             if ( !m_pData->m_bReadOnlyWrap )
5013             {
5014                 m_pImpl->m_bBroadcastModified = sal_True;
5015                 m_pImpl->m_bIsModified = sal_True;
5016             }
5017 		}
5018 		else if ( ( m_pData->m_bIsRoot && ( aPropertyName.equalsAscii( HAS_ENCRYPTED_ENTRIES_PROPERTY )
5019 									|| aPropertyName.equalsAscii( HAS_NONENCRYPTED_ENTRIES_PROPERTY )
5020 									|| aPropertyName.equalsAscii( IS_INCONSISTENT_PROPERTY )
5021 									|| aPropertyName.equalsAscii( "URL" )
5022 									|| aPropertyName.equalsAscii( "RepairPackage" ) ) )
5023 		   || aPropertyName.equalsAscii( "IsRoot" )
5024 		   || aPropertyName.equalsAscii( MEDIATYPE_FALLBACK_USED_PROPERTY ) )
5025 			throw beans::PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5026 		else
5027 			throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5028 	}
5029 	else if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML )
5030 	{
5031 		if ( aPropertyName.equalsAscii( "RelationsInfoStream" ) )
5032 		{
5033 			uno::Reference< io::XInputStream > xInRelStream;
5034 			if ( ( aValue >>= xInRelStream ) && xInRelStream.is() )
5035 			{
5036 				uno::Reference< io::XSeekable > xSeek( xInRelStream, uno::UNO_QUERY );
5037 				if ( !xSeek.is() )
5038 				{
5039 					// currently this is an internal property that is used for optimization
5040 					// and the stream must support XSeekable interface
5041 					// TODO/LATER: in future it can be changed if property is used from outside
5042 					throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 );
5043 				}
5044 
5045 				m_pImpl->m_xNewRelInfoStream = xInRelStream;
5046 				m_pImpl->m_aRelInfo = uno::Sequence< uno::Sequence< beans::StringPair > >();
5047 				m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED_STREAM;
5048 				m_pImpl->m_bBroadcastModified = sal_True;
5049 				m_pImpl->m_bIsModified = sal_True;
5050 			}
5051 			else
5052 				throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 );
5053 		}
5054 		else if ( aPropertyName.equalsAscii( "RelationsInfo" ) )
5055 		{
5056 			if ( aValue >>= m_pImpl->m_aRelInfo )
5057 			{
5058 				m_pImpl->m_xNewRelInfoStream = uno::Reference< io::XInputStream >();
5059 				m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
5060 				m_pImpl->m_bBroadcastModified = sal_True;
5061 				m_pImpl->m_bIsModified = sal_True;
5062 			}
5063 			else
5064 				throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 );
5065 		}
5066 		else if ( ( m_pData->m_bIsRoot && ( aPropertyName.equalsAscii( "URL" )
5067 									|| aPropertyName.equalsAscii( "RepairPackage" ) ) )
5068 		   || aPropertyName.equalsAscii( "IsRoot" ) )
5069 			throw beans::PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5070 		else
5071 			throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5072 	}
5073 	else
5074 		throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5075 
5076 	BroadcastModifiedIfNecessary();
5077 }
5078 
5079 
5080 //-----------------------------------------------
getPropertyValue(const::rtl::OUString & aPropertyName)5081 uno::Any SAL_CALL OStorage::getPropertyValue( const ::rtl::OUString& aPropertyName )
5082 		throw ( beans::UnknownPropertyException,
5083 				lang::WrappedTargetException,
5084 				uno::RuntimeException )
5085 {
5086 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::getPropertyValue" );
5087 
5088 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5089 
5090 	if ( !m_pImpl )
5091     {
5092         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5093         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5094     }
5095 
5096 	if ( m_pData->m_nStorageType == embed::StorageFormats::PACKAGE
5097 	  && ( aPropertyName.equalsAscii( "MediaType" )
5098         || aPropertyName.equalsAscii( MEDIATYPE_FALLBACK_USED_PROPERTY )
5099 	    || aPropertyName.equalsAscii( "Version" ) ) )
5100 	{
5101 		try
5102 		{
5103 			m_pImpl->ReadContents();
5104 		}
5105 		catch ( uno::RuntimeException& aRuntimeException )
5106         {
5107             m_pImpl->AddLog( aRuntimeException.Message );
5108             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5109             throw;
5110 		}
5111 		catch ( uno::Exception& aException )
5112         {
5113             m_pImpl->AddLog( aException.Message );
5114             m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5115 
5116         	uno::Any aCaught( ::cppu::getCaughtException() );
5117 			throw lang::WrappedTargetException(
5118 										::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can't read contents!" ) ),
5119 										uno::Reference< XInterface >( static_cast< OWeakObject* >( this ), uno::UNO_QUERY ),
5120 										aCaught );
5121 		}
5122 
5123 		if ( aPropertyName.equalsAscii( "MediaType" ) )
5124 			return uno::makeAny( m_pImpl->m_aMediaType );
5125 		else if ( aPropertyName.equalsAscii( "Version" ) )
5126 			return uno::makeAny( m_pImpl->m_aVersion );
5127 		else
5128 			return uno::makeAny( m_pImpl->m_bMTFallbackUsed );
5129 	}
5130 	else if ( aPropertyName.equalsAscii( "IsRoot" ) )
5131 	{
5132 		return uno::makeAny( m_pData->m_bIsRoot );
5133 	}
5134 	else if ( aPropertyName.equalsAscii( "OpenMode" ) )
5135 	{
5136 		return uno::makeAny( m_pImpl->m_nStorageMode );
5137 	}
5138 	else if ( m_pData->m_bIsRoot )
5139 	{
5140 		if ( aPropertyName.equalsAscii( "URL" )
5141 		  || aPropertyName.equalsAscii( "RepairPackage" ) )
5142 		{
5143 			for ( sal_Int32 aInd = 0; aInd < m_pImpl->m_xProperties.getLength(); aInd++ )
5144 			{
5145 				if ( m_pImpl->m_xProperties[aInd].Name.equals( aPropertyName ) )
5146 					return m_pImpl->m_xProperties[aInd].Value;
5147 			}
5148 
5149 			if ( aPropertyName.equalsAscii( "URL" ) )
5150 				return uno::makeAny( ::rtl::OUString() );
5151 
5152 			return uno::makeAny( sal_False ); // RepairPackage
5153 		}
5154         else if ( m_pData->m_nStorageType == embed::StorageFormats::PACKAGE
5155           && ( aPropertyName.equalsAscii( HAS_ENCRYPTED_ENTRIES_PROPERTY )
5156             || aPropertyName.equalsAscii( HAS_NONENCRYPTED_ENTRIES_PROPERTY )
5157             || aPropertyName.equalsAscii( IS_INCONSISTENT_PROPERTY ) ) )
5158 		{
5159 			try {
5160 				m_pImpl->ReadContents();
5161 				uno::Reference< beans::XPropertySet > xPackPropSet( m_pImpl->m_xPackage, uno::UNO_QUERY );
5162 				if ( !xPackPropSet.is() )
5163 					throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5164 
5165 				return xPackPropSet->getPropertyValue( aPropertyName );
5166 			}
5167 			catch ( uno::RuntimeException& aRuntimeException )
5168             {
5169                 m_pImpl->AddLog( aRuntimeException.Message );
5170                 m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5171                 throw;
5172 			}
5173 			catch ( uno::Exception& aException )
5174             {
5175                 m_pImpl->AddLog( aException.Message );
5176                 m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5177 
5178         		uno::Any aCaught( ::cppu::getCaughtException() );
5179 				throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can not open package!\n" ) ),
5180 													uno::Reference< uno::XInterface >(  static_cast< OWeakObject* >( this ),
5181 																						uno::UNO_QUERY ),
5182 													aCaught );
5183 			}
5184 		}
5185 	}
5186 
5187 	throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5188 }
5189 
5190 
5191 //-----------------------------------------------
addPropertyChangeListener(const::rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)5192 void SAL_CALL OStorage::addPropertyChangeListener(
5193     const ::rtl::OUString& /*aPropertyName*/,
5194     const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
5195 		throw ( beans::UnknownPropertyException,
5196 				lang::WrappedTargetException,
5197 				uno::RuntimeException )
5198 {
5199 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5200 
5201 	if ( !m_pImpl )
5202     {
5203         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5204         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5205     }
5206 
5207 	//TODO:
5208 }
5209 
5210 
5211 //-----------------------------------------------
removePropertyChangeListener(const::rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> &)5212 void SAL_CALL OStorage::removePropertyChangeListener(
5213     const ::rtl::OUString& /*aPropertyName*/,
5214     const uno::Reference< beans::XPropertyChangeListener >& /*aListener*/ )
5215 		throw ( beans::UnknownPropertyException,
5216 				lang::WrappedTargetException,
5217 				uno::RuntimeException )
5218 {
5219 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5220 
5221 	if ( !m_pImpl )
5222     {
5223         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5224         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5225     }
5226 
5227 	//TODO:
5228 }
5229 
5230 
5231 //-----------------------------------------------
addVetoableChangeListener(const::rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)5232 void SAL_CALL OStorage::addVetoableChangeListener(
5233     const ::rtl::OUString& /*PropertyName*/,
5234     const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ )
5235 		throw ( beans::UnknownPropertyException,
5236 				lang::WrappedTargetException,
5237 				uno::RuntimeException )
5238 {
5239 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5240 
5241 	if ( !m_pImpl )
5242     {
5243         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5244         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5245     }
5246 
5247 	//TODO:
5248 }
5249 
5250 
5251 //-----------------------------------------------
removeVetoableChangeListener(const::rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)5252 void SAL_CALL OStorage::removeVetoableChangeListener(
5253     const ::rtl::OUString& /*PropertyName*/,
5254     const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ )
5255 		throw ( beans::UnknownPropertyException,
5256 				lang::WrappedTargetException,
5257 				uno::RuntimeException )
5258 {
5259 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5260 
5261 	if ( !m_pImpl )
5262     {
5263         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5264         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5265     }
5266 
5267 	//TODO:
5268 }
5269 
5270 //____________________________________________________________________________________________________
5271 //	XRelationshipAccess
5272 //____________________________________________________________________________________________________
5273 
5274 // TODO/LATER: the storage and stream implementations of this interface are very similar, they could use a helper class
5275 
5276 //-----------------------------------------------
hasByID(const::rtl::OUString & sID)5277 sal_Bool SAL_CALL OStorage::hasByID(  const ::rtl::OUString& sID )
5278 		throw ( io::IOException,
5279 				uno::RuntimeException )
5280 {
5281 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5282 
5283 	if ( !m_pImpl )
5284     {
5285         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5286         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5287     }
5288 
5289 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5290 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5291 
5292 	try
5293 	{
5294 		getRelationshipByID( sID );
5295 		return sal_True;
5296 	}
5297 	catch( container::NoSuchElementException& aNoSuchElementException )
5298 	{
5299         m_pImpl->AddLog( aNoSuchElementException.Message );
5300         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Quiet exception" ) ) );
5301     }
5302 
5303 	return sal_False;
5304 }
5305 
5306 //-----------------------------------------------
getTargetByID(const::rtl::OUString & sID)5307 ::rtl::OUString SAL_CALL OStorage::getTargetByID(  const ::rtl::OUString& sID  )
5308 		throw ( container::NoSuchElementException,
5309 				io::IOException,
5310 				uno::RuntimeException )
5311 {
5312 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5313 
5314 	if ( !m_pImpl )
5315     {
5316         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5317         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5318     }
5319 
5320 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5321 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5322 
5323 	uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
5324 	for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
5325 		if ( aSeq[nInd].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Target" ) ) )
5326 			return aSeq[nInd].Second;
5327 
5328 	return ::rtl::OUString();
5329 }
5330 
5331 //-----------------------------------------------
getTypeByID(const::rtl::OUString & sID)5332 ::rtl::OUString SAL_CALL OStorage::getTypeByID(  const ::rtl::OUString& sID  )
5333 		throw ( container::NoSuchElementException,
5334 				io::IOException,
5335 				uno::RuntimeException )
5336 {
5337 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5338 
5339 	if ( !m_pImpl )
5340     {
5341         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5342         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5343     }
5344 
5345 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5346 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5347 
5348 	uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
5349 	for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
5350 		if ( aSeq[nInd].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Type" ) ) )
5351 			return aSeq[nInd].Second;
5352 
5353 	return ::rtl::OUString();
5354 }
5355 
5356 //-----------------------------------------------
getRelationshipByID(const::rtl::OUString & sID)5357 uno::Sequence< beans::StringPair > SAL_CALL OStorage::getRelationshipByID(  const ::rtl::OUString& sID  )
5358 		throw ( container::NoSuchElementException,
5359 				io::IOException,
5360 				uno::RuntimeException )
5361 {
5362 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5363 
5364 	if ( !m_pImpl )
5365     {
5366         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5367         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5368     }
5369 
5370 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5371 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5372 
5373 	// TODO/LATER: in future the unification of the ID could be checked
5374 	uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
5375 	for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
5376 		for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
5377 			if ( aSeq[nInd1][nInd2].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Id" ) ) )
5378 			{
5379 				if ( aSeq[nInd1][nInd2].Second.equals( sID ) )
5380 					return aSeq[nInd1];
5381 				break;
5382 			}
5383 
5384 	throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5385 }
5386 
5387 //-----------------------------------------------
getRelationshipsByType(const::rtl::OUString & sType)5388 uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OStorage::getRelationshipsByType(  const ::rtl::OUString& sType  )
5389 		throw ( io::IOException,
5390 				uno::RuntimeException )
5391 {
5392 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5393 
5394 	if ( !m_pImpl )
5395     {
5396         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5397         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5398     }
5399 
5400 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5401 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5402 
5403 	uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
5404 	sal_Int32 nEntriesNum = 0;
5405 
5406 	// TODO/LATER: in future the unification of the ID could be checked
5407 	uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
5408 	for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
5409 		for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
5410 			if ( aSeq[nInd1][nInd2].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Type" ) ) )
5411 			{
5412                 // the type is usually an URL, so the check should be case insensitive
5413 				if ( aSeq[nInd1][nInd2].Second.equalsIgnoreAsciiCase( sType ) )
5414 				{
5415 					aResult.realloc( ++nEntriesNum );
5416 					aResult[nEntriesNum-1] = aSeq[nInd1];
5417 				}
5418 				break;
5419 			}
5420 
5421 	return aResult;
5422 }
5423 
5424 //-----------------------------------------------
getAllRelationships()5425 uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OStorage::getAllRelationships()
5426 		throw (io::IOException, uno::RuntimeException)
5427 {
5428 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5429 
5430 	if ( !m_pImpl )
5431     {
5432         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5433         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5434     }
5435 
5436 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5437 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5438 
5439 	return m_pImpl->GetAllRelationshipsIfAny();
5440 }
5441 
5442 //-----------------------------------------------
insertRelationshipByID(const::rtl::OUString & sID,const uno::Sequence<beans::StringPair> & aEntry,::sal_Bool bReplace)5443 void SAL_CALL OStorage::insertRelationshipByID(  const ::rtl::OUString& sID, const uno::Sequence< beans::StringPair >& aEntry, ::sal_Bool bReplace  )
5444 		throw ( container::ElementExistException,
5445 				io::IOException,
5446 				uno::RuntimeException )
5447 {
5448 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5449 
5450 	if ( !m_pImpl )
5451     {
5452         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5453         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5454     }
5455 
5456 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5457 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5458 
5459 	::rtl::OUString aIDTag( RTL_CONSTASCII_USTRINGPARAM( "Id" ) );
5460 
5461 	sal_Int32 nIDInd = -1;
5462 
5463 	// TODO/LATER: in future the unification of the ID could be checked
5464 	uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
5465 	for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
5466 		for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
5467 			if ( aSeq[nInd1][nInd2].First.equals( aIDTag ) )
5468 			{
5469 				if ( aSeq[nInd1][nInd2].Second.equals( sID ) )
5470 					nIDInd = nInd1;
5471 
5472 				break;
5473 			}
5474 
5475 	if ( nIDInd == -1 || bReplace )
5476 	{
5477 		if ( nIDInd == -1 )
5478 		{
5479 			nIDInd = aSeq.getLength();
5480 			aSeq.realloc( nIDInd + 1 );
5481 		}
5482 
5483 		aSeq[nIDInd].realloc( aEntry.getLength() + 1 );
5484 
5485 		aSeq[nIDInd][0].First = aIDTag;
5486 		aSeq[nIDInd][0].Second = sID;
5487 		sal_Int32 nIndTarget = 1;
5488 		for ( sal_Int32 nIndOrig = 0;
5489 			  nIndOrig < aEntry.getLength();
5490 			  nIndOrig++ )
5491 		{
5492 			if ( !aEntry[nIndOrig].First.equals( aIDTag ) )
5493 				aSeq[nIDInd][nIndTarget++] = aEntry[nIndOrig];
5494 		}
5495 
5496 		aSeq[nIDInd].realloc( nIndTarget );
5497 	}
5498 	else
5499 		throw container::ElementExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5500 
5501 
5502 	m_pImpl->m_aRelInfo = aSeq;
5503 	m_pImpl->m_xNewRelInfoStream = uno::Reference< io::XInputStream >();
5504 	m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
5505 }
5506 
5507 //-----------------------------------------------
removeRelationshipByID(const::rtl::OUString & sID)5508 void SAL_CALL OStorage::removeRelationshipByID(  const ::rtl::OUString& sID  )
5509 		throw ( container::NoSuchElementException,
5510 				io::IOException,
5511 				uno::RuntimeException )
5512 {
5513 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5514 
5515 	if ( !m_pImpl )
5516     {
5517         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5518         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5519     }
5520 
5521 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5522 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5523 
5524 	uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
5525 	for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
5526 		for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
5527 			if ( aSeq[nInd1][nInd2].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Id" ) ) )
5528 			{
5529 				if ( aSeq[nInd1][nInd2].Second.equals( sID ) )
5530 				{
5531 					sal_Int32 nLength = aSeq.getLength();
5532 					aSeq[nInd1] = aSeq[nLength-1];
5533 					aSeq.realloc( nLength - 1 );
5534 
5535 					m_pImpl->m_aRelInfo = aSeq;
5536 					m_pImpl->m_xNewRelInfoStream = uno::Reference< io::XInputStream >();
5537 					m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
5538 
5539 					// TODO/LATER: in future the unification of the ID could be checked
5540 					return;
5541 				}
5542 
5543 				break;
5544 			}
5545 
5546 	throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5547 }
5548 
5549 //-----------------------------------------------
insertRelationships(const uno::Sequence<uno::Sequence<beans::StringPair>> & aEntries,::sal_Bool bReplace)5550 void SAL_CALL OStorage::insertRelationships(  const uno::Sequence< uno::Sequence< beans::StringPair > >& aEntries, ::sal_Bool bReplace  )
5551 		throw ( container::ElementExistException,
5552 				io::IOException,
5553 				uno::RuntimeException )
5554 {
5555 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5556 
5557 	if ( !m_pImpl )
5558     {
5559         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5560         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5561     }
5562 
5563 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5564 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5565 
5566 	::rtl::OUString aIDTag( RTL_CONSTASCII_USTRINGPARAM( "Id" ) );
5567 	uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
5568 	uno::Sequence< uno::Sequence< beans::StringPair > > aResultSeq( aSeq.getLength() + aEntries.getLength() );
5569 	sal_Int32 nResultInd = 0;
5570 
5571 	for ( sal_Int32 nIndTarget1 = 0; nIndTarget1 < aSeq.getLength(); nIndTarget1++ )
5572 		for ( sal_Int32 nIndTarget2 = 0; nIndTarget2 < aSeq[nIndTarget1].getLength(); nIndTarget2++ )
5573 			if ( aSeq[nIndTarget1][nIndTarget2].First.equals( aIDTag ) )
5574 			{
5575 				sal_Int32 nIndSourceSame = -1;
5576 
5577 				for ( sal_Int32 nIndSource1 = 0; nIndSource1 < aEntries.getLength(); nIndSource1++ )
5578 					for ( sal_Int32 nIndSource2 = 0; nIndSource2 < aEntries[nIndSource1].getLength(); nIndSource2++ )
5579 					{
5580 						if ( aEntries[nIndSource1][nIndSource2].First.equals( aIDTag ) )
5581 						{
5582 							if ( aEntries[nIndSource1][nIndSource2].Second.equals( aSeq[nIndTarget1][nIndTarget2].Second ) )
5583 							{
5584 								if ( !bReplace )
5585 									throw container::ElementExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5586 
5587 								nIndSourceSame = nIndSource1;
5588 							}
5589 
5590 							break;
5591 						}
5592 					}
5593 
5594 				if ( nIndSourceSame == -1 )
5595 				{
5596 					// no such element in the provided sequence
5597 					aResultSeq[nResultInd++] = aSeq[nIndTarget1];
5598 				}
5599 
5600 				break;
5601 			}
5602 
5603 	for ( sal_Int32 nIndSource1 = 0; nIndSource1 < aEntries.getLength(); nIndSource1++ )
5604 	{
5605 		aResultSeq[nResultInd].realloc( aEntries[nIndSource1].getLength() );
5606 		sal_Bool bHasID = sal_False;
5607 		sal_Int32 nResInd2 = 1;
5608 
5609 		for ( sal_Int32 nIndSource2 = 0; nIndSource2 < aEntries[nIndSource1].getLength(); nIndSource2++ )
5610 			if ( aEntries[nIndSource1][nIndSource2].First.equals( aIDTag ) )
5611 			{
5612 				aResultSeq[nResultInd][0] = aEntries[nIndSource1][nIndSource2];
5613 				bHasID = sal_True;
5614 			}
5615 			else if ( nResInd2 < aResultSeq[nResultInd].getLength() )
5616 				aResultSeq[nResultInd][nResInd2++] = aEntries[nIndSource1][nIndSource2];
5617 			else
5618 				throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: illegal relation ( no ID )
5619 
5620 		if ( !bHasID )
5621 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: illegal relations
5622 
5623 		nResultInd++;
5624 	}
5625 
5626 	aResultSeq.realloc( nResultInd );
5627 	m_pImpl->m_aRelInfo = aResultSeq;
5628 	m_pImpl->m_xNewRelInfoStream = uno::Reference< io::XInputStream >();
5629 	m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
5630 }
5631 
5632 //-----------------------------------------------
clearRelationships()5633 void SAL_CALL OStorage::clearRelationships()
5634 		throw ( io::IOException,
5635 				uno::RuntimeException )
5636 {
5637 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5638 
5639 	if ( !m_pImpl )
5640     {
5641         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5642         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5643     }
5644 
5645 	if ( m_pData->m_nStorageType != embed::StorageFormats::OFOPXML )
5646 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5647 
5648 	m_pImpl->m_aRelInfo.realloc( 0 );
5649 	m_pImpl->m_xNewRelInfoStream = uno::Reference< io::XInputStream >();
5650 	m_pImpl->m_nRelInfoStatus = RELINFO_CHANGED;
5651 }
5652 
5653 //____________________________________________________________________________________________________
5654 //	XOptimizedStorage
5655 //____________________________________________________________________________________________________
5656 //-----------------------------------------------
insertRawNonEncrStreamElementDirect(const::rtl::OUString &,const uno::Reference<io::XInputStream> &)5657 void SAL_CALL OStorage::insertRawNonEncrStreamElementDirect(
5658 			const ::rtl::OUString& /*sStreamName*/,
5659 			const uno::Reference< io::XInputStream >& /*xInStream*/ )
5660 		throw ( embed::InvalidStorageException,
5661 				lang::IllegalArgumentException,
5662 				packages::NoRawFormatException,
5663 				container::ElementExistException,
5664 				io::IOException,
5665 				embed::StorageWrappedTargetException,
5666 				uno::RuntimeException )
5667 {
5668 	// not implemented currently because there is still no demand
5669 	// might need to be implemented if direct copying of compressed streams is used
5670 	throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5671 }
5672 
5673 //-----------------------------------------------
insertStreamElementDirect(const::rtl::OUString & aStreamName,const uno::Reference<io::XInputStream> & xInStream,const uno::Sequence<beans::PropertyValue> & aProps)5674 void SAL_CALL OStorage::insertStreamElementDirect(
5675 			const ::rtl::OUString& aStreamName,
5676 			const uno::Reference< io::XInputStream >& xInStream,
5677 			const uno::Sequence< beans::PropertyValue >& aProps )
5678 		throw ( embed::InvalidStorageException,
5679 				lang::IllegalArgumentException,
5680 				container::ElementExistException,
5681 				io::IOException,
5682 				embed::StorageWrappedTargetException,
5683 				uno::RuntimeException )
5684 {
5685 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::insertStreamElementDirect" );
5686 
5687 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5688 
5689 	if ( !m_pImpl )
5690     {
5691         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5692         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5693     }
5694 
5695 	if ( !aStreamName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStreamName, sal_False ) )
5696 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
5697 
5698 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
5699 	  && aStreamName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
5700 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // unacceptable storage name
5701 
5702 	if ( m_pData->m_bReadOnlyWrap )
5703 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: access denied
5704 
5705 	try
5706 	{
5707 		SotElement_Impl* pElement = m_pImpl->FindElement( aStreamName );
5708 
5709 		if ( pElement )
5710 			throw container::ElementExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5711 
5712     	pElement = OpenStreamElement_Impl( aStreamName, embed::ElementModes::READWRITE, sal_False );
5713 		OSL_ENSURE( pElement && pElement->m_pStream, "In case element can not be created an exception must be thrown!" );
5714 
5715 		pElement->m_pStream->InsertStreamDirectly( xInStream, aProps );
5716 	}
5717 	catch( embed::InvalidStorageException& aInvalidStorageException )
5718     {
5719         m_pImpl->AddLog( aInvalidStorageException.Message );
5720         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5721         throw;
5722 	}
5723 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
5724     {
5725         m_pImpl->AddLog( aIllegalArgumentException.Message );
5726         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5727         throw;
5728 	}
5729 	catch( container::ElementExistException& aElementExistException )
5730     {
5731         m_pImpl->AddLog( aElementExistException.Message );
5732         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5733         throw;
5734 	}
5735 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
5736     {
5737         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
5738         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5739         throw;
5740 	}
5741 	catch( io::IOException& aIOException )
5742     {
5743         m_pImpl->AddLog( aIOException.Message );
5744         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5745         throw;
5746 	}
5747 	catch( uno::RuntimeException& aRuntimeException )
5748     {
5749         m_pImpl->AddLog( aRuntimeException.Message );
5750         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5751         throw;
5752 	}
5753 	catch( uno::Exception& aException )
5754 	{
5755       	m_pImpl->AddLog( aException.Message );
5756       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5757 
5758       	uno::Any aCaught( ::cppu::getCaughtException() );
5759 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't insert stream directly!" ) ),
5760 												 uno::Reference< io::XInputStream >(),
5761 												 aCaught );
5762 	}
5763 }
5764 
5765 //-----------------------------------------------
copyElementDirectlyTo(const::rtl::OUString & aElementName,const uno::Reference<embed::XOptimizedStorage> & xDest,const::rtl::OUString & aNewName)5766 void SAL_CALL OStorage::copyElementDirectlyTo(
5767 			const ::rtl::OUString& aElementName,
5768 			const uno::Reference< embed::XOptimizedStorage >& xDest,
5769 			const ::rtl::OUString& aNewName )
5770 		throw ( embed::InvalidStorageException,
5771 				lang::IllegalArgumentException,
5772 				container::NoSuchElementException,
5773 				container::ElementExistException,
5774 				io::IOException,
5775 				embed::StorageWrappedTargetException,
5776 				uno::RuntimeException )
5777 {
5778 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::copyElementDirectlyTo" );
5779 
5780 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5781 
5782 	if ( !m_pImpl )
5783     {
5784         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5785         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5786     }
5787 
5788 	if ( !aElementName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, sal_False )
5789 	  || !aNewName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aNewName, sal_False ) )
5790 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
5791 
5792 	if ( !xDest.is() || xDest == uno::Reference< uno::XInterface >( static_cast< OWeakObject* >( this ), uno::UNO_QUERY ) )
5793 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 2 );
5794 
5795 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
5796 	  && ( aElementName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) )
5797 	    || aNewName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) ) )
5798 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 ); // unacceptable name
5799 
5800 	try
5801 	{
5802 		SotElement_Impl* pElement = m_pImpl->FindElement( aElementName );
5803 		if ( !pElement )
5804 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5805 
5806 		uno::Reference< XNameAccess > xNameAccess( xDest, uno::UNO_QUERY );
5807 		if ( !xNameAccess.is() )
5808 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5809 
5810 		if ( xNameAccess->hasByName( aNewName ) )
5811 			throw container::ElementExistException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5812 
5813 		// let the element be copied directly
5814 		uno::Reference< embed::XStorage > xStorDest( xDest, uno::UNO_QUERY_THROW );
5815 		m_pImpl->CopyStorageElement( pElement, xStorDest, aNewName, sal_True );
5816 	}
5817 	catch( embed::InvalidStorageException& aInvalidStorageException )
5818     {
5819         m_pImpl->AddLog( aInvalidStorageException.Message );
5820         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5821         throw;
5822 	}
5823 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
5824     {
5825         m_pImpl->AddLog( aIllegalArgumentException.Message );
5826         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5827         throw;
5828 	}
5829 	catch( container::NoSuchElementException& aNoSuchElementException )
5830     {
5831         m_pImpl->AddLog( aNoSuchElementException.Message );
5832         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5833         throw;
5834 	}
5835 	catch( container::ElementExistException& aElementExistException )
5836     {
5837         m_pImpl->AddLog( aElementExistException.Message );
5838         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5839         throw;
5840 	}
5841 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
5842     {
5843         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
5844         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5845         throw;
5846 	}
5847 	catch( io::IOException& aIOException )
5848     {
5849         m_pImpl->AddLog( aIOException.Message );
5850         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5851         throw;
5852 	}
5853 	catch( uno::RuntimeException& aRuntimeException )
5854     {
5855         m_pImpl->AddLog( aRuntimeException.Message );
5856         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5857         throw;
5858 	}
5859 	catch( uno::Exception& aException )
5860 	{
5861       	m_pImpl->AddLog( aException.Message );
5862       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5863 
5864       	uno::Any aCaught( ::cppu::getCaughtException() );
5865 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't copy element direcly!" ) ),
5866 												 uno::Reference< io::XInputStream >(),
5867 												 aCaught );
5868 	}
5869 }
5870 
5871 //-----------------------------------------------
writeAndAttachToStream(const uno::Reference<io::XStream> & xStream)5872 void SAL_CALL OStorage::writeAndAttachToStream( const uno::Reference< io::XStream >& xStream )
5873 		throw ( embed::InvalidStorageException,
5874 				lang::IllegalArgumentException,
5875 				io::IOException,
5876 				embed::StorageWrappedTargetException,
5877 				uno::RuntimeException )
5878 {
5879 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::writeAndAttachToStream" );
5880 
5881 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5882 
5883 	if ( !m_pImpl )
5884     {
5885         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5886         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5887     }
5888 
5889 	if ( !m_pData->m_bIsRoot )
5890 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 );
5891 
5892 	if ( !m_pImpl->m_pSwitchStream )
5893 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5894 
5895 	try
5896 	{
5897 		m_pImpl->m_pSwitchStream->CopyAndSwitchPersistenceTo( xStream );
5898 	}
5899 	catch( embed::InvalidStorageException& aInvalidStorageException )
5900     {
5901         m_pImpl->AddLog( aInvalidStorageException.Message );
5902         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5903         throw;
5904 	}
5905 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
5906     {
5907         m_pImpl->AddLog( aIllegalArgumentException.Message );
5908         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5909         throw;
5910 	}
5911 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
5912     {
5913         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
5914         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5915         throw;
5916 	}
5917 	catch( io::IOException& aIOException )
5918     {
5919         m_pImpl->AddLog( aIOException.Message );
5920         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5921         throw;
5922 	}
5923 	catch( uno::RuntimeException& aRuntimeException )
5924     {
5925         m_pImpl->AddLog( aRuntimeException.Message );
5926         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5927         throw;
5928 	}
5929 	catch( uno::Exception& aException )
5930 	{
5931       	m_pImpl->AddLog( aException.Message );
5932       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5933 
5934       	uno::Any aCaught( ::cppu::getCaughtException() );
5935 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't write and attach to stream!" ) ),
5936 												 uno::Reference< io::XInputStream >(),
5937 												 aCaught );
5938 	}
5939 
5940 }
5941 
5942 //-----------------------------------------------
attachToURL(const::rtl::OUString & sURL,sal_Bool bReadOnly)5943 void SAL_CALL OStorage::attachToURL( const ::rtl::OUString& sURL,
5944 									sal_Bool bReadOnly )
5945 		throw ( embed::InvalidStorageException,
5946 				lang::IllegalArgumentException,
5947 				io::IOException,
5948 				embed::StorageWrappedTargetException,
5949 				uno::RuntimeException )
5950 {
5951 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::attachToURL" );
5952 
5953 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
5954 
5955 	if ( !m_pImpl )
5956     {
5957         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
5958         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5959     }
5960 
5961 	if ( !m_pData->m_bIsRoot )
5962 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 );
5963 
5964 	if ( !m_pImpl->m_pSwitchStream )
5965 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
5966 
5967 	uno::Reference < ucb::XSimpleFileAccess > xAccess(
5968 			m_pImpl->m_xFactory->createInstance (
5969 					::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ucb.SimpleFileAccess" ) ) ),
5970 			uno::UNO_QUERY_THROW );
5971 
5972 	try
5973 	{
5974 		if ( bReadOnly )
5975 		{
5976 			uno::Reference< io::XInputStream > xInputStream = xAccess->openFileRead( sURL );
5977 			m_pImpl->m_pSwitchStream->SwitchPersistenceTo( xInputStream );
5978 		}
5979 		else
5980 		{
5981 			uno::Reference< io::XStream > xStream = xAccess->openFileReadWrite( sURL );
5982 			m_pImpl->m_pSwitchStream->SwitchPersistenceTo( xStream );
5983 		}
5984 	}
5985 	catch( embed::InvalidStorageException& aInvalidStorageException )
5986     {
5987         m_pImpl->AddLog( aInvalidStorageException.Message );
5988         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5989         throw;
5990 	}
5991 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
5992     {
5993         m_pImpl->AddLog( aIllegalArgumentException.Message );
5994         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
5995         throw;
5996 	}
5997 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
5998     {
5999         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
6000         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6001         throw;
6002 	}
6003 	catch( io::IOException& aIOException )
6004     {
6005         m_pImpl->AddLog( aIOException.Message );
6006         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6007         throw;
6008 	}
6009 	catch( uno::RuntimeException& aRuntimeException )
6010     {
6011         m_pImpl->AddLog( aRuntimeException.Message );
6012         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6013         throw;
6014 	}
6015 	catch( uno::Exception& aException )
6016 	{
6017       	m_pImpl->AddLog( aException.Message );
6018       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6019 
6020       	uno::Any aCaught( ::cppu::getCaughtException() );
6021 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't attach to URL!" ) ),
6022 												 uno::Reference< io::XInputStream >(),
6023 												 aCaught );
6024 	}
6025 }
6026 
6027 //-----------------------------------------------
getElementPropertyValue(const::rtl::OUString & aElementName,const::rtl::OUString & aPropertyName)6028 uno::Any SAL_CALL OStorage::getElementPropertyValue( const ::rtl::OUString& aElementName, const ::rtl::OUString& aPropertyName )
6029 		throw ( embed::InvalidStorageException,
6030 				lang::IllegalArgumentException,
6031 				container::NoSuchElementException,
6032 				io::IOException,
6033 				beans::UnknownPropertyException,
6034 				beans::PropertyVetoException,
6035 				embed::StorageWrappedTargetException,
6036 				uno::RuntimeException)
6037 {
6038 	RTL_LOGFILE_CONTEXT( aLog, "package (mv76033) OStorage::getElementPropertyValue" );
6039 
6040 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
6041 
6042 	if ( !m_pImpl )
6043     {
6044         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
6045         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6046     }
6047 
6048 	if ( !aElementName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aElementName, sal_False ) )
6049 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
6050 
6051 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
6052 	  && aElementName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
6053 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // TODO: unacceptable name
6054 
6055 	try
6056 	{
6057     	SotElement_Impl *pElement = m_pImpl->FindElement( aElementName );
6058     	if ( !pElement )
6059 			throw container::NoSuchElementException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6060 
6061 		// TODO/LATER: Currently it is only implemented for MediaType property of substorages, might be changed in future
6062 		if ( !pElement->m_bIsStorage || m_pData->m_nStorageType != embed::StorageFormats::PACKAGE || !aPropertyName.equalsAscii( "MediaType" ) )
6063 			throw beans::PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6064 
6065 		if ( !pElement->m_pStorage )
6066 			m_pImpl->OpenSubStorage( pElement, embed::ElementModes::READ );
6067 
6068 		if ( !pElement->m_pStorage )
6069 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // TODO: general_error
6070 
6071 		pElement->m_pStorage->ReadContents();
6072 		return uno::makeAny( pElement->m_pStorage->m_aMediaType );
6073 	}
6074 	catch( embed::InvalidStorageException& aInvalidStorageException )
6075     {
6076         m_pImpl->AddLog( aInvalidStorageException.Message );
6077         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6078         throw;
6079 	}
6080 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
6081     {
6082         m_pImpl->AddLog( aIllegalArgumentException.Message );
6083         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6084         throw;
6085 	}
6086 	catch( container::NoSuchElementException& aNoSuchElementException )
6087     {
6088         m_pImpl->AddLog( aNoSuchElementException.Message );
6089         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6090         throw;
6091 	}
6092 	catch( beans::UnknownPropertyException& aUnknownPropertyException )
6093     {
6094         m_pImpl->AddLog( aUnknownPropertyException.Message );
6095         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6096         throw;
6097 	}
6098 	catch( beans::PropertyVetoException& aPropertyVetoException )
6099     {
6100         m_pImpl->AddLog( aPropertyVetoException.Message );
6101         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6102         throw;
6103 	}
6104 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
6105     {
6106         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
6107         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6108         throw;
6109 	}
6110 	catch( io::IOException& aIOException )
6111     {
6112         m_pImpl->AddLog( aIOException.Message );
6113         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6114         throw;
6115 	}
6116 	catch( uno::RuntimeException& aRuntimeException )
6117     {
6118         m_pImpl->AddLog( aRuntimeException.Message );
6119         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6120         throw;
6121 	}
6122 	catch( uno::Exception& aException )
6123 	{
6124       	m_pImpl->AddLog( aException.Message );
6125       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6126 
6127       	uno::Any aCaught( ::cppu::getCaughtException() );
6128 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't get element property!" ) ),
6129 												 uno::Reference< io::XInputStream >(),
6130 												 aCaught );
6131 	}
6132 }
6133 
6134 //-----------------------------------------------
copyStreamElementData(const::rtl::OUString & aStreamName,const uno::Reference<io::XStream> & xTargetStream)6135 void SAL_CALL OStorage::copyStreamElementData( const ::rtl::OUString& aStreamName, const uno::Reference< io::XStream >& xTargetStream )
6136 		throw ( embed::InvalidStorageException,
6137 				lang::IllegalArgumentException,
6138 				packages::WrongPasswordException,
6139 				io::IOException,
6140 				embed::StorageWrappedTargetException,
6141 				uno::RuntimeException )
6142 {
6143 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
6144 
6145 	if ( !m_pImpl )
6146     {
6147         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
6148         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6149     }
6150 
6151 	if ( !aStreamName.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStreamName, sal_False ) )
6152 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
6153 
6154 	if ( m_pData->m_nStorageType == embed::StorageFormats::OFOPXML
6155 	  && aStreamName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels" ) ) ) )
6156 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 ); // unacceptable name
6157 
6158 	if ( !xTargetStream.is() )
6159 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 2 );
6160 
6161 	try
6162 	{
6163 		uno::Reference< io::XStream > xNonconstRef = xTargetStream;
6164 		m_pImpl->CloneStreamElement( aStreamName, sal_False, ::comphelper::SequenceAsHashMap(), xNonconstRef );
6165 
6166 		OSL_ENSURE( xNonconstRef == xTargetStream, "The provided stream reference seems not be filled in correctly!\n" );
6167 		if ( xNonconstRef != xTargetStream )
6168 			throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // if the stream reference is set it must not be changed!
6169 	}
6170 	catch( embed::InvalidStorageException& aInvalidStorageException )
6171     {
6172         m_pImpl->AddLog( aInvalidStorageException.Message );
6173         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6174         throw;
6175 	}
6176 	catch( lang::IllegalArgumentException& aIllegalArgumentException )
6177     {
6178         m_pImpl->AddLog( aIllegalArgumentException.Message );
6179         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6180         throw;
6181 	}
6182 	catch( packages::WrongPasswordException& aWrongPasswordException )
6183     {
6184         m_pImpl->AddLog( aWrongPasswordException.Message );
6185         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6186         throw;
6187 	}
6188 	catch( io::IOException& aIOException )
6189     {
6190         m_pImpl->AddLog( aIOException.Message );
6191         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6192         throw;
6193 	}
6194 	catch( embed::StorageWrappedTargetException& aStorageWrappedTargetException )
6195     {
6196         m_pImpl->AddLog( aStorageWrappedTargetException.Message );
6197         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6198         throw;
6199 	}
6200 	catch( uno::RuntimeException& aRuntimeException )
6201     {
6202         m_pImpl->AddLog( aRuntimeException.Message );
6203         m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6204         throw;
6205 	}
6206 	catch( uno::Exception& aException )
6207 	{
6208       	m_pImpl->AddLog( aException.Message );
6209       	m_pImpl->AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Rethrow" ) ) );
6210 
6211       	uno::Any aCaught( ::cppu::getCaughtException() );
6212 		throw embed::StorageWrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Can't copy stream data!" ) ),
6213 												 uno::Reference< io::XInputStream >(),
6214 												 aCaught );
6215 	}
6216 
6217 
6218 }
6219 
6220 //____________________________________________________________________________________________________
6221 // XHierarchicalStorageAccess
6222 //____________________________________________________________________________________________________
6223 
6224 //-----------------------------------------------
openStreamElementByHierarchicalName(const::rtl::OUString & aStreamPath,::sal_Int32 nOpenMode)6225 uno::Reference< embed::XExtendedStorageStream > SAL_CALL OStorage::openStreamElementByHierarchicalName( const ::rtl::OUString& aStreamPath, ::sal_Int32 nOpenMode )
6226 		throw ( embed::InvalidStorageException,
6227 				lang::IllegalArgumentException,
6228 				packages::WrongPasswordException,
6229 				io::IOException,
6230 				embed::StorageWrappedTargetException,
6231 				uno::RuntimeException )
6232 {
6233 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
6234 
6235 	if ( !m_pImpl )
6236     {
6237         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
6238         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6239     }
6240 
6241 	if ( !aStreamPath.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStreamPath, sal_True ) )
6242 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
6243 
6244 	if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE )
6245 	  && ( nOpenMode & embed::ElementModes::WRITE ) )
6246 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // Access denied
6247 
6248 	OStringList_Impl aListPath = OHierarchyHolder_Impl::GetListPathFromString( aStreamPath );
6249 	OSL_ENSURE( aListPath.size(), "The result list must not be empty!" );
6250 
6251 	uno::Reference< embed::XExtendedStorageStream > xResult;
6252 	if ( aListPath.size() == 1 )
6253 	{
6254 		// that must be a direct request for a stream
6255 		// the transacted version of the stream should be opened
6256 
6257     	SotElement_Impl *pElement = OpenStreamElement_Impl( aStreamPath, nOpenMode, sal_False );
6258 		OSL_ENSURE( pElement && pElement->m_pStream, "In case element can not be created an exception must be thrown!" );
6259 
6260 		xResult = uno::Reference< embed::XExtendedStorageStream >(
6261 						pElement->m_pStream->GetStream( nOpenMode, sal_True ),
6262 						uno::UNO_QUERY_THROW );
6263 	}
6264 	else
6265 	{
6266 		// there are still storages in between
6267 		if ( !m_pData->m_rHierarchyHolder.is() )
6268 			m_pData->m_rHierarchyHolder = new OHierarchyHolder_Impl(
6269 				uno::Reference< embed::XStorage >( static_cast< embed::XStorage* >( this ) ) );
6270 
6271 		xResult = m_pData->m_rHierarchyHolder->GetStreamHierarchically(
6272 												( m_pImpl->m_nStorageMode & embed::ElementModes::READWRITE ),
6273 												aListPath,
6274 												nOpenMode );
6275 	}
6276 
6277 	if ( !xResult.is() )
6278 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6279 
6280 	return xResult;
6281 }
6282 
6283 //-----------------------------------------------
openEncryptedStreamElementByHierarchicalName(const::rtl::OUString & aStreamPath,::sal_Int32 nOpenMode,const::rtl::OUString & sPassword)6284 uno::Reference< embed::XExtendedStorageStream > SAL_CALL OStorage::openEncryptedStreamElementByHierarchicalName( const ::rtl::OUString& aStreamPath, ::sal_Int32 nOpenMode, const ::rtl::OUString& sPassword )
6285 		throw ( embed::InvalidStorageException,
6286 				lang::IllegalArgumentException,
6287 				packages::NoEncryptionException,
6288 				packages::WrongPasswordException,
6289 				io::IOException,
6290 				embed::StorageWrappedTargetException,
6291 				uno::RuntimeException )
6292 {
6293     return openEncryptedStreamByHierarchicalName( aStreamPath, nOpenMode, ::comphelper::OStorageHelper::CreatePackageEncryptionData( sPassword ) );
6294 }
6295 
6296 //-----------------------------------------------
removeStreamElementByHierarchicalName(const::rtl::OUString & aStreamPath)6297 void SAL_CALL OStorage::removeStreamElementByHierarchicalName( const ::rtl::OUString& aStreamPath )
6298 		throw ( embed::InvalidStorageException,
6299 				lang::IllegalArgumentException,
6300 				container::NoSuchElementException,
6301 				io::IOException,
6302 				embed::StorageWrappedTargetException,
6303 				uno::RuntimeException )
6304 {
6305 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
6306 
6307 	if ( !m_pImpl )
6308     {
6309         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
6310         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6311     }
6312 
6313 	if ( !aStreamPath.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStreamPath, sal_True ) )
6314 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
6315 
6316 	if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE ) )
6317 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // Access denied
6318 
6319 	OStringList_Impl aListPath = OHierarchyHolder_Impl::GetListPathFromString( aStreamPath );
6320 	OSL_ENSURE( aListPath.size(), "The result list must not be empty!" );
6321 
6322 	if ( !m_pData->m_rHierarchyHolder.is() )
6323 		m_pData->m_rHierarchyHolder = new OHierarchyHolder_Impl(
6324 			uno::Reference< embed::XStorage >( static_cast< embed::XStorage* >( this ) ) );
6325 
6326 	m_pData->m_rHierarchyHolder->RemoveStreamHierarchically( aListPath );
6327 }
6328 
6329 //____________________________________________________________________________________________________
6330 // XHierarchicalStorageAccess2
6331 //____________________________________________________________________________________________________
6332 
openEncryptedStreamByHierarchicalName(const::rtl::OUString & aStreamPath,::sal_Int32 nOpenMode,const uno::Sequence<beans::NamedValue> & aEncryptionData)6333 uno::Reference< embed::XExtendedStorageStream > SAL_CALL OStorage::openEncryptedStreamByHierarchicalName( const ::rtl::OUString& aStreamPath, ::sal_Int32 nOpenMode, const uno::Sequence< beans::NamedValue >& aEncryptionData )
6334 		throw ( embed::InvalidStorageException,
6335 				lang::IllegalArgumentException,
6336 				packages::NoEncryptionException,
6337 				packages::WrongPasswordException,
6338 				io::IOException,
6339 				embed::StorageWrappedTargetException,
6340 				uno::RuntimeException )
6341 {
6342 	::osl::MutexGuard aGuard( m_pData->m_rSharedMutexRef->GetMutex() );
6343 
6344 	if ( !m_pImpl )
6345     {
6346         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
6347         throw lang::DisposedException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6348     }
6349 
6350 	if ( m_pData->m_nStorageType != embed::StorageFormats::PACKAGE )
6351 		throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6352 
6353 	if ( !aStreamPath.getLength() || !::comphelper::OStorageHelper::IsValidZipEntryFileName( aStreamPath, sal_True ) )
6354 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Unexpected entry name syntax." ) ), uno::Reference< uno::XInterface >(), 1 );
6355 
6356 	if ( !aEncryptionData.getLength() )
6357 		throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 3 );
6358 
6359 	if ( !( m_pImpl->m_nStorageMode & embed::ElementModes::WRITE )
6360 	  && ( nOpenMode & embed::ElementModes::WRITE ) )
6361 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); // Access denied
6362 
6363 	OStringList_Impl aListPath = OHierarchyHolder_Impl::GetListPathFromString( aStreamPath );
6364 	OSL_ENSURE( aListPath.size(), "The result list must not be empty!" );
6365 
6366 	uno::Reference< embed::XExtendedStorageStream > xResult;
6367 	if ( aListPath.size() == 1 )
6368 	{
6369 		// that must be a direct request for a stream
6370 		// the transacted version of the stream should be opened
6371 
6372     	SotElement_Impl *pElement = OpenStreamElement_Impl( aStreamPath, nOpenMode, sal_True );
6373 		OSL_ENSURE( pElement && pElement->m_pStream, "In case element can not be created an exception must be thrown!" );
6374 
6375 		xResult = uno::Reference< embed::XExtendedStorageStream >(
6376 						pElement->m_pStream->GetStream( nOpenMode, aEncryptionData, sal_True ),
6377 						uno::UNO_QUERY_THROW );
6378 	}
6379 	else
6380 	{
6381 		// there are still storages in between
6382 		if ( !m_pData->m_rHierarchyHolder.is() )
6383 			m_pData->m_rHierarchyHolder = new OHierarchyHolder_Impl(
6384 				uno::Reference< embed::XStorage >( static_cast< embed::XStorage* >( this ) ) );
6385 
6386 		xResult = m_pData->m_rHierarchyHolder->GetStreamHierarchically(
6387 												( m_pImpl->m_nStorageMode & embed::ElementModes::READWRITE ),
6388 												aListPath,
6389 												nOpenMode,
6390 												aEncryptionData );
6391 	}
6392 
6393 	if ( !xResult.is() )
6394 		throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
6395 
6396 	return xResult;
6397 }
6398 
6399 
6400