Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/lang/DisposedException.hpp>
21 : #include <com/sun/star/io/XStream.hpp>
22 : #include <com/sun/star/io/XInputStream.hpp>
23 : #include <com/sun/star/io/XSeekable.hpp>
24 : #include <com/sun/star/io/XTruncate.hpp>
25 : #include <com/sun/star/io/TempFile.hpp>
26 :
27 : #include <comphelper/processfactory.hxx>
28 : #include <comphelper/storagehelper.hxx>
29 :
30 : #include <unotools/ucbstreamhelper.hxx>
31 :
32 : #include <cppuhelper/exc_hlp.hxx>
33 : #include <cppuhelper/supportsservice.hxx>
34 :
35 : #include <sot/storinfo.hxx>
36 :
37 : #include "xolesimplestorage.hxx"
38 :
39 :
40 : using namespace ::com::sun::star;
41 :
42 : const sal_Int32 nBytesCount = 32000;
43 :
44 :
45 :
46 0 : OLESimpleStorage::OLESimpleStorage( uno::Reference< lang::XMultiServiceFactory > xFactory )
47 : : m_bDisposed( false )
48 : , m_pStream( NULL )
49 : , m_pStorage( NULL )
50 : , m_pListenersContainer( NULL )
51 : , m_xFactory( xFactory )
52 0 : , m_bNoTemporaryCopy( false )
53 : {
54 : OSL_ENSURE( m_xFactory.is(), "No factory is provided on creation!\n" );
55 0 : if ( !m_xFactory.is() )
56 0 : throw uno::RuntimeException();
57 0 : }
58 :
59 :
60 0 : OLESimpleStorage::~OLESimpleStorage()
61 : {
62 : try {
63 0 : m_refCount++;
64 0 : dispose();
65 0 : } catch( uno::Exception& )
66 : {}
67 :
68 0 : if ( m_pListenersContainer )
69 : {
70 0 : delete m_pListenersContainer;
71 0 : m_pListenersContainer = NULL;
72 : }
73 0 : }
74 :
75 :
76 0 : uno::Sequence< OUString > SAL_CALL OLESimpleStorage::impl_staticGetSupportedServiceNames()
77 : {
78 0 : uno::Sequence< OUString > aRet(1);
79 0 : aRet[0] = "com.sun.star.embed.OLESimpleStorage";
80 0 : return aRet;
81 : }
82 :
83 :
84 0 : OUString SAL_CALL OLESimpleStorage::impl_staticGetImplementationName()
85 : {
86 0 : return OUString("com.sun.star.comp.embed.OLESimpleStorage");
87 : }
88 :
89 :
90 0 : uno::Reference< uno::XInterface > SAL_CALL OLESimpleStorage::impl_staticCreateSelfInstance(
91 : const uno::Reference< lang::XMultiServiceFactory >& xServiceManager )
92 : {
93 0 : return uno::Reference< uno::XInterface >( *new OLESimpleStorage( xServiceManager ) );
94 : }
95 :
96 :
97 0 : void OLESimpleStorage::UpdateOriginal_Impl()
98 : {
99 0 : if ( !m_bNoTemporaryCopy )
100 : {
101 0 : uno::Reference< io::XSeekable > xSeek( m_xStream, uno::UNO_QUERY_THROW );
102 0 : xSeek->seek( 0 );
103 :
104 0 : uno::Reference< io::XSeekable > xTempSeek( m_xTempStream, uno::UNO_QUERY_THROW );
105 0 : sal_Int64 nPos = xTempSeek->getPosition();
106 0 : xTempSeek->seek( 0 );
107 :
108 0 : uno::Reference< io::XInputStream > xTempInp = m_xTempStream->getInputStream();
109 0 : uno::Reference< io::XOutputStream > xOutputStream = m_xStream->getOutputStream();
110 0 : if ( !xTempInp.is() || !xOutputStream.is() )
111 0 : throw uno::RuntimeException();
112 :
113 0 : uno::Reference< io::XTruncate > xTrunc( xOutputStream, uno::UNO_QUERY_THROW );
114 0 : xTrunc->truncate();
115 :
116 0 : ::comphelper::OStorageHelper::CopyInputToOutput( xTempInp, xOutputStream );
117 0 : xOutputStream->flush();
118 0 : xTempSeek->seek( nPos );
119 : }
120 0 : }
121 :
122 :
123 0 : void OLESimpleStorage::InsertInputStreamToStorage_Impl( BaseStorage* pStorage, const OUString & aName, const uno::Reference< io::XInputStream >& xInputStream )
124 : throw ( uno::Exception )
125 : {
126 0 : if ( !pStorage || aName.isEmpty() || !xInputStream.is() )
127 0 : throw uno::RuntimeException();
128 :
129 0 : if ( pStorage->IsContained( aName ) )
130 0 : throw container::ElementExistException(); // TODO:
131 :
132 0 : BaseStorageStream* pNewStream = pStorage->OpenStream( aName );
133 0 : if ( !pNewStream || pNewStream->GetError() || pStorage->GetError() )
134 : {
135 0 : if ( pNewStream )
136 0 : DELETEZ( pNewStream );
137 0 : pStorage->ResetError();
138 0 : throw io::IOException(); // TODO
139 : }
140 :
141 : try
142 : {
143 0 : uno::Sequence< sal_Int8 > aData( nBytesCount );
144 0 : sal_Int32 nRead = 0;
145 0 : do
146 : {
147 0 : nRead = xInputStream->readBytes( aData, nBytesCount );
148 0 : if ( nRead < nBytesCount )
149 0 : aData.realloc( nRead );
150 :
151 0 : sal_Int32 nWritten = pNewStream->Write( aData.getArray(), nRead );
152 0 : if ( nWritten < nRead )
153 0 : throw io::IOException();
154 0 : } while( nRead == nBytesCount );
155 : }
156 0 : catch( uno::Exception& )
157 : {
158 0 : DELETEZ( pNewStream );
159 0 : pStorage->Remove( aName );
160 :
161 0 : throw;
162 : }
163 :
164 0 : DELETEZ( pNewStream );
165 0 : }
166 :
167 :
168 0 : void OLESimpleStorage::InsertNameAccessToStorage_Impl( BaseStorage* pStorage, const OUString & aName, const uno::Reference< container::XNameAccess >& xNameAccess )
169 : throw ( uno::Exception )
170 : {
171 0 : if ( !pStorage || aName.isEmpty() || !xNameAccess.is() )
172 0 : throw uno::RuntimeException();
173 :
174 0 : if ( pStorage->IsContained( aName ) )
175 0 : throw container::ElementExistException(); // TODO:
176 :
177 0 : BaseStorage* pNewStorage = pStorage->OpenStorage( aName );
178 0 : if ( !pNewStorage || pNewStorage->GetError() || pStorage->GetError() )
179 : {
180 0 : if ( pNewStorage )
181 0 : DELETEZ( pNewStorage );
182 0 : pStorage->ResetError();
183 0 : throw io::IOException(); // TODO
184 : }
185 :
186 : try
187 : {
188 0 : uno::Sequence< OUString > aElements = xNameAccess->getElementNames();
189 0 : for ( sal_Int32 nInd = 0; nInd < aElements.getLength(); nInd++ )
190 : {
191 0 : uno::Reference< io::XInputStream > xInputStream;
192 0 : uno::Reference< container::XNameAccess > xSubNameAccess;
193 0 : uno::Any aAny = xNameAccess->getByName( aElements[nInd] );
194 0 : if ( aAny >>= xInputStream )
195 0 : InsertInputStreamToStorage_Impl( pNewStorage, aElements[nInd], xInputStream );
196 0 : else if ( aAny >>= xSubNameAccess )
197 0 : InsertNameAccessToStorage_Impl( pNewStorage, aElements[nInd], xSubNameAccess );
198 0 : }
199 : }
200 0 : catch( uno::Exception& )
201 : {
202 0 : DELETEZ( pNewStorage );
203 0 : pStorage->Remove( aName );
204 :
205 0 : throw;
206 : }
207 :
208 0 : DELETEZ( pNewStorage );
209 0 : }
210 :
211 :
212 : // XInitialization
213 :
214 :
215 0 : void SAL_CALL OLESimpleStorage::initialize( const uno::Sequence< uno::Any >& aArguments )
216 : throw ( uno::Exception,
217 : uno::RuntimeException, std::exception)
218 : {
219 0 : if ( m_pStream || m_pStorage )
220 0 : throw io::IOException(); // TODO: already initilized
221 :
222 0 : sal_Int32 nArgNum = aArguments.getLength();
223 : OSL_ENSURE( nArgNum >= 1 && nArgNum <= 2, "Wrong parameter number" );
224 :
225 0 : if ( nArgNum < 1 || nArgNum > 2 )
226 0 : throw lang::IllegalArgumentException(); // TODO:
227 :
228 0 : uno::Reference< io::XStream > xStream;
229 0 : uno::Reference< io::XInputStream > xInputStream;
230 0 : if ( !( aArguments[0] >>= xStream ) && !( aArguments[0] >>= xInputStream ) )
231 0 : throw lang::IllegalArgumentException(); // TODO:
232 :
233 0 : if ( nArgNum == 2 )
234 : {
235 0 : if ( !( aArguments[1] >>= m_bNoTemporaryCopy ) )
236 0 : throw lang::IllegalArgumentException(); // TODO:
237 : }
238 :
239 0 : if ( m_bNoTemporaryCopy )
240 : {
241 : // TODO: ???
242 : // If the temporary stream is not created, the original stream must be wrapped
243 : // since SvStream wrapper closes the stream is owns
244 0 : if ( xInputStream.is() )
245 : {
246 : // the stream must be seekable for direct access
247 0 : uno::Reference< io::XSeekable > xSeek( xInputStream, uno::UNO_QUERY_THROW );
248 0 : m_pStream = ::utl::UcbStreamHelper::CreateStream( xInputStream, false );
249 : }
250 0 : else if ( xStream.is() )
251 : {
252 : // the stream must be seekable for direct access
253 0 : uno::Reference< io::XSeekable > xSeek( xStream, uno::UNO_QUERY_THROW );
254 0 : m_pStream = ::utl::UcbStreamHelper::CreateStream( xStream, false );
255 : }
256 : else
257 0 : throw lang::IllegalArgumentException(); // TODO:
258 : }
259 : else
260 : {
261 : uno::Reference < io::XStream > xTempFile(
262 : io::TempFile::create(comphelper::getComponentContext(m_xFactory)),
263 0 : uno::UNO_QUERY_THROW );
264 0 : uno::Reference < io::XSeekable > xTempSeek( xTempFile, uno::UNO_QUERY_THROW );
265 0 : uno::Reference< io::XOutputStream > xTempOut = xTempFile->getOutputStream();
266 0 : if ( !xTempOut.is() )
267 0 : throw uno::RuntimeException();
268 :
269 0 : if ( xInputStream.is() )
270 : {
271 : try
272 : {
273 0 : uno::Reference< io::XSeekable > xSeek( xInputStream, uno::UNO_QUERY_THROW );
274 0 : xSeek->seek( 0 );
275 : }
276 0 : catch( uno::Exception& )
277 : {}
278 :
279 0 : ::comphelper::OStorageHelper::CopyInputToOutput( xInputStream, xTempOut );
280 0 : xTempOut->closeOutput();
281 0 : xTempSeek->seek( 0 );
282 0 : uno::Reference< io::XInputStream > xTempInput = xTempFile->getInputStream();
283 0 : m_pStream = ::utl::UcbStreamHelper::CreateStream( xTempInput, false );
284 : }
285 0 : else if ( xStream.is() )
286 : {
287 : // not sure that the storage flashes the stream on commit
288 0 : m_xStream = xStream;
289 0 : m_xTempStream = xTempFile;
290 :
291 0 : uno::Reference< io::XSeekable > xSeek( xStream, uno::UNO_QUERY_THROW );
292 0 : xSeek->seek( 0 );
293 0 : uno::Reference< io::XInputStream > xInpStream = xStream->getInputStream();
294 0 : if ( !xInpStream.is() || !xStream->getOutputStream().is() )
295 0 : throw uno::RuntimeException();
296 :
297 0 : ::comphelper::OStorageHelper::CopyInputToOutput( xInpStream, xTempOut );
298 0 : xTempOut->flush();
299 0 : xTempSeek->seek( 0 );
300 :
301 0 : m_pStream = ::utl::UcbStreamHelper::CreateStream( xTempFile, false );
302 : }
303 : else
304 0 : throw lang::IllegalArgumentException(); // TODO:
305 : }
306 :
307 0 : if ( !m_pStream || m_pStream->GetError() )
308 0 : throw io::IOException(); // TODO
309 :
310 0 : m_pStorage = new Storage( *m_pStream, false );
311 0 : }
312 :
313 :
314 :
315 : // XNameContainer
316 :
317 :
318 :
319 0 : void SAL_CALL OLESimpleStorage::insertByName( const OUString& aName, const uno::Any& aElement )
320 : throw ( lang::IllegalArgumentException,
321 : container::ElementExistException,
322 : lang::WrappedTargetException,
323 : uno::RuntimeException, std::exception)
324 : {
325 0 : ::osl::MutexGuard aGuard( m_aMutex );
326 :
327 0 : if ( m_bDisposed )
328 0 : throw lang::DisposedException();
329 :
330 0 : if ( !m_pStorage )
331 0 : throw uno::RuntimeException();
332 :
333 0 : uno::Reference< io::XStream > xStream;
334 0 : uno::Reference< io::XInputStream > xInputStream;
335 0 : uno::Reference< container::XNameAccess > xNameAccess;
336 :
337 : try
338 : {
339 0 : if ( !m_bNoTemporaryCopy && !m_xStream.is() )
340 0 : throw io::IOException(); // TODO
341 :
342 0 : if ( aElement >>= xStream )
343 0 : xInputStream = xStream->getInputStream();
344 0 : else if ( !( aElement >>= xInputStream ) && !( aElement >>= xNameAccess ) )
345 0 : throw lang::IllegalArgumentException(); // TODO:
346 :
347 0 : if ( xInputStream.is() )
348 0 : InsertInputStreamToStorage_Impl( m_pStorage, aName, xInputStream );
349 0 : else if ( xNameAccess.is() )
350 0 : InsertNameAccessToStorage_Impl( m_pStorage, aName, xNameAccess );
351 : else
352 0 : throw uno::RuntimeException();
353 : }
354 0 : catch( uno::RuntimeException& )
355 : {
356 0 : throw;
357 : }
358 0 : catch( container::ElementExistException& )
359 : {
360 0 : throw;
361 : }
362 0 : catch( const uno::Exception& e )
363 : {
364 : throw lang::WrappedTargetException("Insert has failed!",
365 : uno::Reference< uno::XInterface >(),
366 0 : uno::makeAny( e ) );
367 0 : }
368 0 : }
369 :
370 :
371 0 : void SAL_CALL OLESimpleStorage::removeByName( const OUString& aName )
372 : throw ( container::NoSuchElementException,
373 : lang::WrappedTargetException,
374 : uno::RuntimeException, std::exception)
375 : {
376 0 : ::osl::MutexGuard aGuard( m_aMutex );
377 :
378 0 : if ( m_bDisposed )
379 0 : throw lang::DisposedException();
380 :
381 0 : if ( !m_pStorage )
382 0 : throw uno::RuntimeException();
383 :
384 0 : if ( !m_bNoTemporaryCopy && !m_xStream.is() )
385 0 : throw lang::WrappedTargetException(); // io::IOException(); // TODO
386 :
387 0 : if ( !m_pStorage->IsContained( aName ) )
388 0 : throw container::NoSuchElementException(); // TODO:
389 :
390 0 : m_pStorage->Remove( aName );
391 :
392 0 : if ( m_pStorage->GetError() )
393 : {
394 0 : m_pStorage->ResetError();
395 0 : throw lang::WrappedTargetException(); // io::IOException(); // TODO
396 0 : }
397 0 : }
398 :
399 :
400 0 : void SAL_CALL OLESimpleStorage::replaceByName( const OUString& aName, const uno::Any& aElement )
401 : throw ( lang::IllegalArgumentException,
402 : container::NoSuchElementException,
403 : lang::WrappedTargetException,
404 : uno::RuntimeException, std::exception)
405 : {
406 0 : ::osl::MutexGuard aGuard( m_aMutex );
407 :
408 0 : if ( m_bDisposed )
409 0 : throw lang::DisposedException();
410 :
411 0 : removeByName( aName );
412 :
413 : try
414 : {
415 0 : insertByName( aName, aElement );
416 : }
417 0 : catch( container::ElementExistException& )
418 : {
419 0 : uno::Any aCaught( ::cppu::getCaughtException() );
420 :
421 : throw lang::WrappedTargetException("Can't copy raw stream",
422 : uno::Reference< uno::XInterface >(),
423 0 : aCaught );
424 0 : }
425 0 : }
426 :
427 :
428 0 : uno::Any SAL_CALL OLESimpleStorage::getByName( const OUString& aName )
429 : throw ( container::NoSuchElementException,
430 : lang::WrappedTargetException,
431 : uno::RuntimeException, std::exception )
432 : {
433 0 : ::osl::MutexGuard aGuard( m_aMutex );
434 :
435 0 : if ( m_bDisposed )
436 0 : throw lang::DisposedException();
437 :
438 0 : if ( !m_pStorage )
439 0 : throw uno::RuntimeException();
440 :
441 0 : if ( !m_pStorage->IsContained( aName ) )
442 0 : throw container::NoSuchElementException(); // TODO:
443 :
444 0 : uno::Any aResult;
445 :
446 : uno::Reference< io::XStream > xTempFile(
447 : io::TempFile::create(comphelper::getComponentContext(m_xFactory)),
448 0 : uno::UNO_QUERY );
449 0 : uno::Reference< io::XSeekable > xSeekable( xTempFile, uno::UNO_QUERY_THROW );
450 0 : uno::Reference< io::XOutputStream > xOutputStream = xTempFile->getOutputStream();
451 0 : uno::Reference< io::XInputStream > xInputStream = xTempFile->getInputStream();
452 0 : if ( !xOutputStream.is() || !xInputStream.is() )
453 0 : throw uno::RuntimeException();
454 :
455 0 : if ( m_pStorage->IsStorage( aName ) )
456 : {
457 0 : BaseStorage* pStrg = m_pStorage->OpenStorage( aName );
458 0 : m_pStorage->ResetError();
459 0 : if ( !pStrg )
460 0 : throw io::IOException();
461 :
462 0 : SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( xTempFile, false ); // do not close the original stream
463 0 : if ( !pStream )
464 0 : throw uno::RuntimeException();
465 :
466 0 : BaseStorage* pNewStor = new Storage( *pStream, false );
467 0 : bool bSuccess = ( pStrg->CopyTo( pNewStor ) && pNewStor->Commit() &&
468 0 : !pNewStor->GetError() && !pStrg->GetError() );
469 :
470 0 : DELETEZ( pNewStor );
471 0 : DELETEZ( pStrg );
472 0 : DELETEZ( pStream );
473 :
474 0 : if ( !bSuccess )
475 0 : throw uno::RuntimeException();
476 :
477 0 : uno::Sequence< uno::Any > aArgs( 2 );
478 0 : aArgs[0] <<= xInputStream; // allow readonly access only
479 0 : aArgs[1] <<= true; // do not create copy
480 :
481 : uno::Reference< container::XNameContainer > xResultNameContainer(
482 0 : m_xFactory->createInstanceWithArguments(
483 : OUString("com.sun.star.embed.OLESimpleStorage"),
484 0 : aArgs ),
485 0 : uno::UNO_QUERY_THROW );
486 :
487 0 : aResult <<= xResultNameContainer;
488 : }
489 : else
490 : {
491 0 : BaseStorageStream* pStream = m_pStorage->OpenStream( aName, STREAM_READ | STREAM_SHARE_DENYALL | STREAM_NOCREATE );
492 0 : if ( !pStream || pStream->GetError() || m_pStorage->GetError() )
493 : {
494 0 : m_pStorage->ResetError();
495 0 : DELETEZ( pStream );
496 0 : throw io::IOException(); // TODO
497 : }
498 :
499 : try
500 : {
501 0 : uno::Sequence< sal_Int8 > aData( nBytesCount );
502 0 : sal_Int32 nSize = nBytesCount;
503 0 : sal_Int32 nRead = 0;
504 0 : while( 0 != ( nRead = pStream->Read( aData.getArray(), nSize ) ) )
505 : {
506 0 : if ( nRead < nSize )
507 : {
508 0 : nSize = nRead;
509 0 : aData.realloc( nSize );
510 : }
511 :
512 0 : xOutputStream->writeBytes( aData );
513 : }
514 :
515 0 : if ( pStream->GetError() )
516 0 : throw io::IOException(); // TODO
517 :
518 0 : xOutputStream->closeOutput();
519 0 : xSeekable->seek( 0 );
520 : }
521 0 : catch( uno::RuntimeException& )
522 : {
523 0 : DELETEZ( pStream );
524 0 : throw;
525 : }
526 0 : catch( uno::Exception& )
527 : {
528 0 : DELETEZ( pStream );
529 0 : throw lang::WrappedTargetException(); // TODO:
530 : }
531 :
532 0 : DELETEZ( pStream );
533 :
534 0 : aResult <<= xInputStream;
535 : }
536 :
537 0 : return aResult;
538 : }
539 :
540 :
541 0 : uno::Sequence< OUString > SAL_CALL OLESimpleStorage::getElementNames()
542 : throw ( uno::RuntimeException, std::exception )
543 : {
544 0 : ::osl::MutexGuard aGuard( m_aMutex );
545 :
546 0 : if ( m_bDisposed )
547 0 : throw lang::DisposedException();
548 :
549 0 : if ( !m_pStorage )
550 0 : throw uno::RuntimeException();
551 :
552 0 : SvStorageInfoList aList;
553 0 : m_pStorage->FillInfoList( &aList );
554 :
555 0 : if ( m_pStorage->GetError() )
556 : {
557 0 : m_pStorage->ResetError();
558 0 : throw uno::RuntimeException(); // TODO:
559 : }
560 :
561 0 : uno::Sequence< OUString > aSeq( aList.size() );
562 0 : for ( sal_uInt32 nInd = 0; nInd < aList.size(); nInd++ )
563 0 : aSeq[nInd] = aList[nInd].GetName();
564 :
565 0 : return aSeq;
566 : }
567 :
568 :
569 0 : sal_Bool SAL_CALL OLESimpleStorage::hasByName( const OUString& aName )
570 : throw ( uno::RuntimeException, std::exception )
571 : {
572 0 : ::osl::MutexGuard aGuard( m_aMutex );
573 :
574 0 : if ( m_bDisposed )
575 0 : throw lang::DisposedException();
576 :
577 0 : if ( !m_pStorage )
578 0 : throw uno::RuntimeException();
579 :
580 0 : bool bResult = m_pStorage->IsContained( aName );
581 :
582 0 : if ( m_pStorage->GetError() )
583 : {
584 0 : m_pStorage->ResetError();
585 0 : throw uno::RuntimeException(); // TODO:
586 : }
587 :
588 0 : return bResult ? sal_True : sal_False;
589 : }
590 :
591 :
592 0 : uno::Type SAL_CALL OLESimpleStorage::getElementType()
593 : throw ( uno::RuntimeException, std::exception )
594 : {
595 0 : ::osl::MutexGuard aGuard( m_aMutex );
596 :
597 0 : if ( m_bDisposed )
598 0 : throw lang::DisposedException();
599 :
600 0 : return getCppuType( (const uno::Reference< io::XInputStream >*)NULL );
601 : }
602 :
603 :
604 0 : sal_Bool SAL_CALL OLESimpleStorage::hasElements()
605 : throw ( uno::RuntimeException, std::exception )
606 : {
607 0 : ::osl::MutexGuard aGuard( m_aMutex );
608 :
609 0 : if ( m_bDisposed )
610 0 : throw lang::DisposedException();
611 :
612 0 : if ( !m_pStorage )
613 0 : throw uno::RuntimeException();
614 :
615 0 : SvStorageInfoList aList;
616 0 : m_pStorage->FillInfoList( &aList );
617 :
618 0 : if ( m_pStorage->GetError() )
619 : {
620 0 : m_pStorage->ResetError();
621 0 : throw uno::RuntimeException(); // TODO:
622 : }
623 :
624 0 : return aList.size() != 0 ? sal_True : sal_False;
625 : }
626 :
627 :
628 : // XComponent
629 :
630 :
631 :
632 0 : void SAL_CALL OLESimpleStorage::dispose()
633 : throw ( uno::RuntimeException, std::exception )
634 : {
635 0 : ::osl::MutexGuard aGuard( m_aMutex );
636 :
637 0 : if ( m_bDisposed )
638 0 : throw lang::DisposedException();
639 :
640 0 : if ( m_pListenersContainer )
641 : {
642 0 : lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) );
643 0 : m_pListenersContainer->disposeAndClear( aSource );
644 : }
645 :
646 0 : DELETEZ( m_pStorage );
647 0 : DELETEZ( m_pStream );
648 :
649 0 : m_xStream = uno::Reference< io::XStream >();
650 0 : m_xTempStream = uno::Reference< io::XStream >();
651 :
652 0 : m_bDisposed = true;
653 0 : }
654 :
655 :
656 0 : void SAL_CALL OLESimpleStorage::addEventListener(
657 : const uno::Reference< lang::XEventListener >& xListener )
658 : throw ( uno::RuntimeException, std::exception )
659 : {
660 0 : ::osl::MutexGuard aGuard( m_aMutex );
661 :
662 0 : if ( m_bDisposed )
663 0 : throw lang::DisposedException();
664 :
665 0 : if ( !m_pListenersContainer )
666 0 : m_pListenersContainer = new ::cppu::OInterfaceContainerHelper( m_aMutex );
667 :
668 0 : m_pListenersContainer->addInterface( xListener );
669 0 : }
670 :
671 :
672 0 : void SAL_CALL OLESimpleStorage::removeEventListener(
673 : const uno::Reference< lang::XEventListener >& xListener )
674 : throw ( uno::RuntimeException, std::exception )
675 : {
676 0 : ::osl::MutexGuard aGuard( m_aMutex );
677 :
678 0 : if ( m_bDisposed )
679 0 : throw lang::DisposedException();
680 :
681 0 : if ( m_pListenersContainer )
682 0 : m_pListenersContainer->removeInterface( xListener );
683 0 : }
684 :
685 :
686 : // XTransactedObject
687 :
688 :
689 :
690 0 : void SAL_CALL OLESimpleStorage::commit()
691 : throw ( ::com::sun::star::io::IOException,
692 : ::com::sun::star::lang::WrappedTargetException,
693 : ::com::sun::star::uno::RuntimeException, std::exception )
694 : {
695 0 : ::osl::MutexGuard aGuard( m_aMutex );
696 :
697 0 : if ( m_bDisposed )
698 0 : throw lang::DisposedException();
699 :
700 0 : if ( !m_pStorage )
701 0 : throw uno::RuntimeException();
702 :
703 0 : if ( !m_bNoTemporaryCopy && !m_xStream.is() )
704 0 : throw io::IOException(); // TODO
705 :
706 0 : if ( !m_pStorage->Commit() || m_pStorage->GetError() )
707 : {
708 0 : m_pStorage->ResetError();
709 0 : throw io::IOException(); // TODO
710 : }
711 :
712 0 : UpdateOriginal_Impl();
713 0 : }
714 :
715 :
716 0 : void SAL_CALL OLESimpleStorage::revert()
717 : throw ( ::com::sun::star::io::IOException,
718 : ::com::sun::star::lang::WrappedTargetException,
719 : ::com::sun::star::uno::RuntimeException, std::exception )
720 : {
721 0 : ::osl::MutexGuard aGuard( m_aMutex );
722 :
723 0 : if ( m_bDisposed )
724 0 : throw lang::DisposedException();
725 :
726 0 : if ( !m_pStorage )
727 0 : throw uno::RuntimeException();
728 :
729 0 : if ( !m_bNoTemporaryCopy && !m_xStream.is() )
730 0 : throw io::IOException(); // TODO
731 :
732 0 : if ( !m_pStorage->Revert() || m_pStorage->GetError() )
733 : {
734 0 : m_pStorage->ResetError();
735 0 : throw io::IOException(); // TODO
736 : }
737 :
738 0 : UpdateOriginal_Impl();
739 0 : }
740 :
741 :
742 : // XClassifiedObject
743 :
744 :
745 0 : uno::Sequence< sal_Int8 > SAL_CALL OLESimpleStorage::getClassID()
746 : throw ( uno::RuntimeException, std::exception )
747 : {
748 0 : ::osl::MutexGuard aGuard( m_aMutex );
749 :
750 0 : if ( m_bDisposed )
751 0 : throw lang::DisposedException();
752 :
753 0 : if ( !m_pStorage )
754 0 : throw uno::RuntimeException();
755 :
756 0 : return m_pStorage->GetClassName().GetByteSequence();
757 : }
758 :
759 0 : OUString SAL_CALL OLESimpleStorage::getClassName()
760 : throw ( uno::RuntimeException, std::exception )
761 : {
762 0 : return OUString();
763 : }
764 :
765 0 : void SAL_CALL OLESimpleStorage::setClassInfo( const uno::Sequence< sal_Int8 >& /*aClassID*/,
766 : const OUString& /*sClassName*/ )
767 : throw ( lang::NoSupportException,
768 : uno::RuntimeException, std::exception )
769 : {
770 0 : throw lang::NoSupportException();
771 : }
772 :
773 : // XServiceInfo
774 0 : OUString SAL_CALL OLESimpleStorage::getImplementationName()
775 : throw ( uno::RuntimeException, std::exception )
776 : {
777 0 : return impl_staticGetImplementationName();
778 : }
779 :
780 0 : sal_Bool SAL_CALL OLESimpleStorage::supportsService( const OUString& ServiceName )
781 : throw ( uno::RuntimeException, std::exception )
782 : {
783 0 : return cppu::supportsService(this, ServiceName);
784 : }
785 :
786 0 : uno::Sequence< OUString > SAL_CALL OLESimpleStorage::getSupportedServiceNames()
787 : throw ( uno::RuntimeException, std::exception )
788 : {
789 0 : return impl_staticGetSupportedServiceNames();
790 : }
791 :
792 :
793 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|