xref: /trunk/main/package/source/xstor/ocompinstream.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_package.hxx"
30 
31 #include "ocompinstream.hxx"
32 #include <com/sun/star/embed/StorageFormats.hpp>
33 #include <com/sun/star/lang/DisposedException.hpp>
34 #include <osl/diagnose.h>
35 
36 #include "owriteablestream.hxx"
37 #include "xstorage.hxx"
38 
39 using namespace ::com::sun::star;
40 
41 //-----------------------------------------------
42 OInputCompStream::OInputCompStream( OWriteStream_Impl& aImpl,
43                                     uno::Reference < io::XInputStream > xStream,
44                                     const uno::Sequence< beans::PropertyValue >& aProps,
45                                     sal_Int32 nStorageType )
46 : m_pImpl( &aImpl )
47 , m_rMutexRef( m_pImpl->m_rMutexRef )
48 , m_xStream( xStream )
49 , m_pInterfaceContainer( NULL )
50 , m_aProperties( aProps )
51 , m_bDisposed( sal_False )
52 , m_nStorageType( nStorageType )
53 {
54     OSL_ENSURE( m_pImpl->m_rMutexRef.Is(), "No mutex is provided!\n" );
55     if ( !m_pImpl->m_rMutexRef.Is() )
56         throw uno::RuntimeException(); // just a disaster
57 
58     OSL_ENSURE( xStream.is(), "No stream is provided!\n" );
59 }
60 
61 //-----------------------------------------------
62 OInputCompStream::OInputCompStream( uno::Reference < io::XInputStream > xStream,
63                                     const uno::Sequence< beans::PropertyValue >& aProps,
64                                     sal_Int32 nStorageType )
65 : m_pImpl( NULL )
66 , m_rMutexRef( new SotMutexHolder )
67 , m_xStream( xStream )
68 , m_pInterfaceContainer( NULL )
69 , m_aProperties( aProps )
70 , m_bDisposed( sal_False )
71 , m_nStorageType( nStorageType )
72 {
73     OSL_ENSURE( xStream.is(), "No stream is provided!\n" );
74 }
75 
76 //-----------------------------------------------
77 OInputCompStream::~OInputCompStream()
78 {
79     {
80         ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
81 
82         if ( !m_bDisposed )
83         {
84             m_refCount++;
85             dispose();
86         }
87 
88         if ( m_pInterfaceContainer )
89             delete m_pInterfaceContainer;
90     }
91 }
92 
93 //-----------------------------------------------
94 uno::Any SAL_CALL OInputCompStream::queryInterface( const uno::Type& rType )
95         throw( uno::RuntimeException )
96 {
97     uno::Any aReturn;
98 
99     // common interfaces
100     aReturn <<= ::cppu::queryInterface
101                 (   rType
102                     ,   static_cast<io::XInputStream*> ( this )
103                     ,   static_cast<io::XStream*> ( this )
104                     ,   static_cast<lang::XComponent*> ( this )
105                     ,   static_cast<beans::XPropertySet*> ( this )
106                     ,   static_cast<embed::XExtendedStorageStream*> ( this ) );
107 
108     if ( aReturn.hasValue() == sal_True )
109         return aReturn ;
110 
111     if ( m_nStorageType == embed::StorageFormats::OFOPXML )
112     {
113         aReturn <<= ::cppu::queryInterface
114                     (   rType
115                         ,   static_cast<embed::XRelationshipAccess*> ( this ) );
116 
117         if ( aReturn.hasValue() == sal_True )
118             return aReturn ;
119     }
120 
121     return OWeakObject::queryInterface( rType );
122 }
123 
124 //-----------------------------------------------
125 sal_Int32 SAL_CALL OInputCompStream::readBytes( uno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead )
126         throw ( io::NotConnectedException,
127                 io::BufferSizeExceededException,
128                 io::IOException,
129                 uno::RuntimeException )
130 {
131     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
132     if ( m_bDisposed )
133     {
134         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
135         throw lang::DisposedException();
136     }
137 
138     if ( !m_xStream.is() )
139     {
140         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No stream!" ) ) );
141         throw uno::RuntimeException();
142     }
143 
144     return m_xStream->readBytes( aData, nBytesToRead );
145 }
146 
147 //-----------------------------------------------
148 sal_Int32 SAL_CALL OInputCompStream::readSomeBytes( uno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead )
149         throw ( io::NotConnectedException,
150                 io::BufferSizeExceededException,
151                 io::IOException,
152                 uno::RuntimeException )
153 {
154     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
155     if ( m_bDisposed )
156     {
157         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
158         throw lang::DisposedException();
159     }
160 
161     if ( !m_xStream.is() )
162     {
163         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No stream!" ) ) );
164         throw uno::RuntimeException();
165     }
166 
167     return m_xStream->readSomeBytes( aData, nMaxBytesToRead );
168 
169 }
170 
171 //-----------------------------------------------
172 void SAL_CALL OInputCompStream::skipBytes( sal_Int32 nBytesToSkip )
173         throw ( io::NotConnectedException,
174                 io::BufferSizeExceededException,
175                 io::IOException,
176                 uno::RuntimeException )
177 {
178     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
179     if ( m_bDisposed )
180     {
181         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
182         throw lang::DisposedException();
183     }
184 
185     if ( !m_xStream.is() )
186     {
187         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No stream!" ) ) );
188         throw uno::RuntimeException();
189     }
190 
191     m_xStream->skipBytes( nBytesToSkip );
192 
193 }
194 
195 //-----------------------------------------------
196 sal_Int32 SAL_CALL OInputCompStream::available(  )
197         throw ( io::NotConnectedException,
198                 io::IOException,
199                 uno::RuntimeException )
200 {
201     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
202     if ( m_bDisposed )
203     {
204         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
205         throw lang::DisposedException();
206     }
207 
208     if ( !m_xStream.is() )
209     {
210         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No stream!" ) ) );
211         throw uno::RuntimeException();
212     }
213 
214     return m_xStream->available();
215 
216 }
217 
218 //-----------------------------------------------
219 void SAL_CALL OInputCompStream::closeInput(  )
220         throw ( io::NotConnectedException,
221                 io::IOException,
222                 uno::RuntimeException )
223 {
224     dispose();
225 }
226 
227 //-----------------------------------------------
228 uno::Reference< io::XInputStream > SAL_CALL OInputCompStream::getInputStream()
229         throw ( uno::RuntimeException )
230 {
231     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
232     if ( m_bDisposed )
233     {
234         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
235         throw lang::DisposedException();
236     }
237 
238     if ( !m_xStream.is() )
239         return uno::Reference< io::XInputStream >();
240 
241     return uno::Reference< io::XInputStream >( static_cast< io::XInputStream* >( this ), uno::UNO_QUERY );
242 }
243 
244 //-----------------------------------------------
245 uno::Reference< io::XOutputStream > SAL_CALL OInputCompStream::getOutputStream()
246         throw ( uno::RuntimeException )
247 {
248     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
249     if ( m_bDisposed )
250     {
251         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
252         throw lang::DisposedException();
253     }
254 
255     return uno::Reference< io::XOutputStream >();
256 }
257 
258 //-----------------------------------------------
259 void OInputCompStream::InternalDispose()
260 {
261     // can be called only by OWriteStream_Impl
262     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
263     if ( m_bDisposed )
264     {
265         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
266         throw lang::DisposedException();
267     }
268 
269     // the source object is also a kind of locker for the current object
270     // since the listeners could dispose the object while being notified
271     lang::EventObject aSource( static_cast< ::cppu::OWeakObject*>( this ) );
272 
273     if ( m_pInterfaceContainer )
274         m_pInterfaceContainer->disposeAndClear( aSource );
275 
276     try
277     {
278         m_xStream->closeInput();
279     }
280     catch( uno::Exception& )
281     {}
282 
283     m_pImpl = NULL;
284     m_bDisposed = sal_True;
285 }
286 
287 //-----------------------------------------------
288 void SAL_CALL OInputCompStream::dispose(  )
289         throw ( uno::RuntimeException )
290 {
291     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
292     if ( m_bDisposed )
293     {
294         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
295         throw lang::DisposedException();
296     }
297 
298     if ( m_pInterfaceContainer )
299     {
300         lang::EventObject aSource( static_cast< ::cppu::OWeakObject*>( this ) );
301         m_pInterfaceContainer->disposeAndClear( aSource );
302     }
303 
304     m_xStream->closeInput();
305 
306     if ( m_pImpl )
307     {
308         m_pImpl->InputStreamDisposed( this );
309         m_pImpl = NULL;
310     }
311 
312     m_bDisposed = sal_True;
313 }
314 
315 //-----------------------------------------------
316 void SAL_CALL OInputCompStream::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
317         throw ( uno::RuntimeException )
318 {
319     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
320     if ( m_bDisposed )
321     {
322         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
323         throw lang::DisposedException();
324     }
325 
326     if ( !m_pInterfaceContainer )
327         m_pInterfaceContainer = new ::cppu::OInterfaceContainerHelper( m_rMutexRef->GetMutex() );
328 
329     m_pInterfaceContainer->addInterface( xListener );
330 }
331 
332 //-----------------------------------------------
333 void SAL_CALL OInputCompStream::removeEventListener( const uno::Reference< lang::XEventListener >& xListener )
334         throw ( uno::RuntimeException )
335 {
336     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
337     if ( m_bDisposed )
338     {
339         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
340         throw lang::DisposedException();
341     }
342 
343     if ( m_pInterfaceContainer )
344         m_pInterfaceContainer->removeInterface( xListener );
345 }
346 
347 //-----------------------------------------------
348 sal_Bool SAL_CALL OInputCompStream::hasByID(  const ::rtl::OUString& sID )
349         throw ( io::IOException,
350                 uno::RuntimeException )
351 {
352     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
353 
354     if ( m_bDisposed )
355     {
356         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
357         throw lang::DisposedException();
358     }
359 
360     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
361         throw uno::RuntimeException();
362 
363     try
364     {
365         getRelationshipByID( sID );
366         return sal_True;
367     }
368     catch( container::NoSuchElementException& )
369     {}
370 
371     return sal_False;
372 }
373 
374 //-----------------------------------------------
375 ::rtl::OUString SAL_CALL OInputCompStream::getTargetByID(  const ::rtl::OUString& sID  )
376         throw ( container::NoSuchElementException,
377                 io::IOException,
378                 uno::RuntimeException )
379 {
380     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
381 
382     if ( m_bDisposed )
383     {
384         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
385         throw lang::DisposedException();
386     }
387 
388     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
389         throw uno::RuntimeException();
390 
391     uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
392     for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
393         if ( aSeq[nInd].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Target" ) ) )
394             return aSeq[nInd].Second;
395 
396     return ::rtl::OUString();
397 }
398 
399 //-----------------------------------------------
400 ::rtl::OUString SAL_CALL OInputCompStream::getTypeByID(  const ::rtl::OUString& sID  )
401         throw ( container::NoSuchElementException,
402                 io::IOException,
403                 uno::RuntimeException )
404 {
405     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
406 
407     if ( m_bDisposed )
408     {
409         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
410         throw lang::DisposedException();
411     }
412 
413     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
414         throw uno::RuntimeException();
415 
416     uno::Sequence< beans::StringPair > aSeq = getRelationshipByID( sID );
417     for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
418         if ( aSeq[nInd].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Type" ) ) )
419             return aSeq[nInd].Second;
420 
421     return ::rtl::OUString();
422 }
423 
424 //-----------------------------------------------
425 uno::Sequence< beans::StringPair > SAL_CALL OInputCompStream::getRelationshipByID(  const ::rtl::OUString& sID  )
426         throw ( container::NoSuchElementException,
427                 io::IOException,
428                 uno::RuntimeException )
429 {
430     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
431 
432     if ( m_bDisposed )
433     {
434         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
435         throw lang::DisposedException();
436     }
437 
438     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
439         throw uno::RuntimeException();
440 
441     // TODO/LATER: in future the unification of the ID could be checked
442     uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
443     for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
444         for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
445             if ( aSeq[nInd1][nInd2].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Id" ) ) )
446             {
447                 if ( aSeq[nInd1][nInd2].Second.equals( sID ) )
448                     return aSeq[nInd1];
449                 break;
450             }
451 
452     throw container::NoSuchElementException();
453 }
454 
455 //-----------------------------------------------
456 uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OInputCompStream::getRelationshipsByType(  const ::rtl::OUString& sType  )
457         throw ( io::IOException,
458                 uno::RuntimeException )
459 {
460     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
461 
462     if ( m_bDisposed )
463     {
464         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
465         throw lang::DisposedException();
466     }
467 
468     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
469         throw uno::RuntimeException();
470 
471     uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
472     sal_Int32 nEntriesNum = 0;
473 
474     // TODO/LATER: in future the unification of the ID could be checked
475     uno::Sequence< uno::Sequence< beans::StringPair > > aSeq = getAllRelationships();
476     for ( sal_Int32 nInd1 = 0; nInd1 < aSeq.getLength(); nInd1++ )
477         for ( sal_Int32 nInd2 = 0; nInd2 < aSeq[nInd1].getLength(); nInd2++ )
478             if ( aSeq[nInd1][nInd2].First.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Type" ) ) )
479             {
480                 if ( aSeq[nInd1][nInd2].Second.equals( sType ) )
481                 {
482                     aResult.realloc( nEntriesNum );
483                     aResult[nEntriesNum-1] = aSeq[nInd1];
484                 }
485                 break;
486             }
487 
488     return aResult;
489 }
490 
491 //-----------------------------------------------
492 uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OInputCompStream::getAllRelationships()
493         throw (io::IOException, uno::RuntimeException)
494 {
495     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
496 
497     if ( m_bDisposed )
498     {
499         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
500         throw lang::DisposedException();
501     }
502 
503     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
504         throw uno::RuntimeException();
505 
506     // TODO/LATER: in future the information could be taken directly from m_pImpl when possible
507     uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
508     for ( sal_Int32 aInd = 0; aInd < m_aProperties.getLength(); aInd++ )
509         if ( m_aProperties[aInd].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "RelationsInfo" ) ) )
510         {
511             if ( m_aProperties[aInd].Value >>= aResult )
512                 return aResult;
513 
514             break;
515         }
516 
517     throw io::IOException(); // the relations info could not be read
518 }
519 
520 //-----------------------------------------------
521 void SAL_CALL OInputCompStream::insertRelationshipByID(  const ::rtl::OUString& /*sID*/, const uno::Sequence< beans::StringPair >& /*aEntry*/, ::sal_Bool /*bReplace*/  )
522         throw ( container::ElementExistException,
523                 io::IOException,
524                 uno::RuntimeException )
525 {
526     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
527 
528     if ( m_bDisposed )
529     {
530         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
531         throw lang::DisposedException();
532     }
533 
534     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
535         throw uno::RuntimeException();
536 
537     throw io::IOException(); // TODO: Access denied
538 }
539 
540 //-----------------------------------------------
541 void SAL_CALL OInputCompStream::removeRelationshipByID(  const ::rtl::OUString& /*sID*/  )
542         throw ( container::NoSuchElementException,
543                 io::IOException,
544                 uno::RuntimeException )
545 {
546     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
547 
548     if ( m_bDisposed )
549     {
550         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
551         throw lang::DisposedException();
552     }
553 
554     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
555         throw uno::RuntimeException();
556 
557     throw io::IOException(); // TODO: Access denied
558 }
559 
560 //-----------------------------------------------
561 void SAL_CALL OInputCompStream::insertRelationships(  const uno::Sequence< uno::Sequence< beans::StringPair > >& /*aEntries*/, ::sal_Bool /*bReplace*/  )
562         throw ( container::ElementExistException,
563                 io::IOException,
564                 uno::RuntimeException )
565 {
566     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
567 
568     if ( m_bDisposed )
569     {
570         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
571         throw lang::DisposedException();
572     }
573 
574     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
575         throw uno::RuntimeException();
576 
577     throw io::IOException(); // TODO: Access denied
578 }
579 
580 //-----------------------------------------------
581 void SAL_CALL OInputCompStream::clearRelationships()
582         throw ( io::IOException,
583                 uno::RuntimeException )
584 {
585     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
586 
587     if ( m_bDisposed )
588     {
589         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
590         throw lang::DisposedException();
591     }
592 
593     if ( m_nStorageType != embed::StorageFormats::OFOPXML )
594         throw uno::RuntimeException();
595 
596     throw io::IOException(); // TODO: Access denied
597 }
598 
599 //-----------------------------------------------
600 uno::Reference< beans::XPropertySetInfo > SAL_CALL OInputCompStream::getPropertySetInfo()
601         throw ( uno::RuntimeException )
602 {
603     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
604 
605     if ( m_bDisposed )
606     {
607         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
608         throw lang::DisposedException();
609     }
610 
611     //TODO:
612     return uno::Reference< beans::XPropertySetInfo >();
613 }
614 
615 //-----------------------------------------------
616 void SAL_CALL OInputCompStream::setPropertyValue( const ::rtl::OUString& aPropertyName, const uno::Any& /*aValue*/ )
617         throw ( beans::UnknownPropertyException,
618                 beans::PropertyVetoException,
619                 lang::IllegalArgumentException,
620                 lang::WrappedTargetException,
621                 uno::RuntimeException )
622 {
623     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
624 
625     if ( m_bDisposed )
626     {
627         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
628         throw lang::DisposedException();
629     }
630 
631     // all the provided properties are accessible
632     for ( sal_Int32 aInd = 0; aInd < m_aProperties.getLength(); aInd++ )
633     {
634         if ( m_aProperties[aInd].Name.equals( aPropertyName ) )
635         {
636             throw beans::PropertyVetoException(); // TODO
637         }
638     }
639 
640     throw beans::UnknownPropertyException(); // TODO
641 }
642 
643 
644 //-----------------------------------------------
645 uno::Any SAL_CALL OInputCompStream::getPropertyValue( const ::rtl::OUString& aProp )
646         throw ( beans::UnknownPropertyException,
647                 lang::WrappedTargetException,
648                 uno::RuntimeException )
649 {
650     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
651 
652     if ( m_bDisposed )
653     {
654         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
655         throw lang::DisposedException();
656     }
657 
658     ::rtl::OUString aPropertyName;
659     if ( aProp.equalsAscii( "IsEncrypted" ) )
660         aPropertyName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Encrypted" ) );
661     else
662         aPropertyName = aProp;
663 
664     if ( aPropertyName.equalsAscii( "RelationsInfo" ) )
665         throw beans::UnknownPropertyException(); // TODO
666 
667     // all the provided properties are accessible
668     for ( sal_Int32 aInd = 0; aInd < m_aProperties.getLength(); aInd++ )
669     {
670         if ( m_aProperties[aInd].Name.equals( aPropertyName ) )
671         {
672             return m_aProperties[aInd].Value;
673         }
674     }
675 
676     throw beans::UnknownPropertyException(); // TODO
677 }
678 
679 
680 //-----------------------------------------------
681 void SAL_CALL OInputCompStream::addPropertyChangeListener(
682     const ::rtl::OUString& /*aPropertyName*/,
683     const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
684         throw ( beans::UnknownPropertyException,
685                 lang::WrappedTargetException,
686                 uno::RuntimeException )
687 {
688     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
689 
690     if ( m_bDisposed )
691     {
692         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
693         throw lang::DisposedException();
694     }
695 
696     //TODO:
697 }
698 
699 
700 //-----------------------------------------------
701 void SAL_CALL OInputCompStream::removePropertyChangeListener(
702     const ::rtl::OUString& /*aPropertyName*/,
703     const uno::Reference< beans::XPropertyChangeListener >& /*aListener*/ )
704         throw ( beans::UnknownPropertyException,
705                 lang::WrappedTargetException,
706                 uno::RuntimeException )
707 {
708     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
709 
710     if ( m_bDisposed )
711     {
712         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
713         throw lang::DisposedException();
714     }
715 
716     //TODO:
717 }
718 
719 
720 //-----------------------------------------------
721 void SAL_CALL OInputCompStream::addVetoableChangeListener(
722     const ::rtl::OUString& /*PropertyName*/,
723     const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ )
724         throw ( beans::UnknownPropertyException,
725                 lang::WrappedTargetException,
726                 uno::RuntimeException )
727 {
728     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
729 
730     if ( m_bDisposed )
731     {
732         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
733         throw lang::DisposedException();
734     }
735 
736     //TODO:
737 }
738 
739 
740 //-----------------------------------------------
741 void SAL_CALL OInputCompStream::removeVetoableChangeListener(
742     const ::rtl::OUString& /*PropertyName*/,
743     const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ )
744         throw ( beans::UnknownPropertyException,
745                 lang::WrappedTargetException,
746                 uno::RuntimeException )
747 {
748     ::osl::MutexGuard aGuard( m_rMutexRef->GetMutex() );
749 
750     if ( m_bDisposed )
751     {
752         ::package::StaticAddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Disposed!" ) ) );
753         throw lang::DisposedException();
754     }
755 
756     //TODO:
757 }
758 
759 
760