| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef INCLUDED_TDOC_STGELEMS_HXX |
| #define INCLUDED_TDOC_STGELEMS_HXX |
| |
| #include <memory> |
| |
| #include "osl/mutex.hxx" |
| #include "rtl/ref.hxx" |
| |
| #include "cppuhelper/implbase2.hxx" |
| #include "cppuhelper/implbase5.hxx" |
| |
| #include "com/sun/star/embed/XStorage.hpp" |
| #include "com/sun/star/embed/XTransactedObject.hpp" |
| #include "com/sun/star/io/XOutputStream.hpp" |
| #include "com/sun/star/io/XStream.hpp" |
| #include "com/sun/star/io/XTruncate.hpp" |
| #include "com/sun/star/lang/XComponent.hpp" |
| |
| #include "tdoc_storage.hxx" |
| |
| namespace tdoc_ucp { |
| |
| struct MutexHolder |
| { |
| osl::Mutex m_aMutex; |
| }; |
| |
| //======================================================================= |
| |
| class ParentStorageHolder : public MutexHolder |
| { |
| public: |
| ParentStorageHolder( |
| const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > & xParentStorage, |
| const rtl::OUString & rUri ); |
| |
| bool isParentARootStorage() const |
| { return m_bParentIsRootStorage; } |
| com::sun::star::uno::Reference< com::sun::star::embed::XStorage > |
| getParentStorage() const |
| { return m_xParentStorage; } |
| void setParentStorage( const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > & xStg ) |
| { osl::MutexGuard aGuard( m_aMutex ); m_xParentStorage = xStg; } |
| |
| private: |
| com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > m_xParentStorage; |
| bool m_bParentIsRootStorage; |
| }; |
| |
| //======================================================================= |
| |
| typedef |
| cppu::WeakImplHelper2< |
| com::sun::star::embed::XStorage, |
| com::sun::star::embed::XTransactedObject > StorageUNOBase; |
| |
| class Storage : public StorageUNOBase, public ParentStorageHolder |
| { |
| public: |
| Storage( |
| const com::sun::star::uno::Reference< |
| com::sun::star::lang::XMultiServiceFactory > & xSMgr, |
| const rtl::Reference< StorageElementFactory > & xFactory, |
| const rtl::OUString & rUri, |
| const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > & xParentStorage, |
| const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > & xStorageToWrap ); |
| virtual ~Storage(); |
| |
| bool isDocumentStorage() const { return m_bIsDocumentStorage; } |
| |
| // XInterface |
| virtual com::sun::star::uno::Any SAL_CALL queryInterface( |
| const com::sun::star::uno::Type& aType ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL acquire() |
| throw (); |
| virtual void SAL_CALL release() |
| throw (); |
| |
| // XTypeProvider (implemnented by base, but needs to be overridden for |
| // delegating to aggregate) |
| virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL |
| getTypes() |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL |
| getImplementationId() |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| // XComponent ( one of XStorage bases ) |
| virtual void SAL_CALL |
| dispose() |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| addEventListener( const com::sun::star::uno::Reference< |
| com::sun::star::lang::XEventListener > & xListener ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| removeEventListener( const com::sun::star::uno::Reference< |
| com::sun::star::lang::XEventListener >& aListener ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| // XNameAccess ( one of XStorage bases ) |
| virtual com::sun::star::uno::Any SAL_CALL |
| getByName( const rtl::OUString& aName ) |
| throw ( com::sun::star::container::NoSuchElementException, |
| com::sun::star::lang::WrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL |
| getElementNames() |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual sal_Bool SAL_CALL |
| hasByName( const rtl::OUString& aName ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| // XElementAccess (base of XNameAccess) |
| virtual com::sun::star::uno::Type SAL_CALL |
| getElementType() |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual sal_Bool SAL_CALL |
| hasElements() |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| // XStorage |
| virtual void SAL_CALL |
| copyToStorage( const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage >& xDest ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Reference< com::sun::star::io::XStream > SAL_CALL |
| openStreamElement( const ::rtl::OUString& aStreamName, |
| sal_Int32 nOpenMode ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::packages::WrongPasswordException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Reference< com::sun::star::io::XStream > SAL_CALL |
| openEncryptedStreamElement( const ::rtl::OUString& aStreamName, |
| sal_Int32 nOpenMode, |
| const ::rtl::OUString& aPassword ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::packages::NoEncryptionException, |
| com::sun::star::packages::WrongPasswordException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Reference< com::sun::star::embed::XStorage > SAL_CALL |
| openStorageElement( const ::rtl::OUString& aStorName, |
| sal_Int32 nOpenMode ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Reference< com::sun::star::io::XStream > SAL_CALL |
| cloneStreamElement( const ::rtl::OUString& aStreamName ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::packages::WrongPasswordException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Reference< com::sun::star::io::XStream > SAL_CALL |
| cloneEncryptedStreamElement( const ::rtl::OUString& aStreamName, |
| const ::rtl::OUString& aPassword ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::packages::NoEncryptionException, |
| com::sun::star::packages::WrongPasswordException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| copyLastCommitTo( const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage >& xTargetStorage ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| copyStorageElementLastCommitTo( const ::rtl::OUString& aStorName, |
| const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > & |
| xTargetStorage ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual sal_Bool SAL_CALL |
| isStreamElement( const ::rtl::OUString& aElementName ) |
| throw ( com::sun::star::container::NoSuchElementException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::embed::InvalidStorageException, |
| com::sun::star::uno::RuntimeException ); |
| virtual sal_Bool SAL_CALL |
| isStorageElement( const ::rtl::OUString& aElementName ) |
| throw ( com::sun::star::container::NoSuchElementException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::embed::InvalidStorageException, |
| com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| removeElement( const ::rtl::OUString& aElementName ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::container::NoSuchElementException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| renameElement( const ::rtl::OUString& aEleName, |
| const ::rtl::OUString& aNewName ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::container::NoSuchElementException, |
| com::sun::star::container::ElementExistException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| copyElementTo( const ::rtl::OUString& aElementName, |
| const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage >& xDest, |
| const ::rtl::OUString& aNewName ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::container::NoSuchElementException, |
| com::sun::star::container::ElementExistException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| moveElementTo( const ::rtl::OUString& aElementName, |
| const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage >& xDest, |
| const ::rtl::OUString& rNewName ) |
| throw ( com::sun::star::embed::InvalidStorageException, |
| com::sun::star::lang::IllegalArgumentException, |
| com::sun::star::container::NoSuchElementException, |
| com::sun::star::container::ElementExistException, |
| com::sun::star::io::IOException, |
| com::sun::star::embed::StorageWrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| |
| // XTransactedObject |
| virtual void SAL_CALL commit() |
| throw ( com::sun::star::io::IOException, |
| com::sun::star::lang::WrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL revert() |
| throw ( com::sun::star::io::IOException, |
| com::sun::star::lang::WrappedTargetException, |
| com::sun::star::uno::RuntimeException ); |
| |
| private: |
| Storage( const rtl::Reference< Storage > & rFactory ); // n.i. |
| |
| rtl::Reference< StorageElementFactory > m_xFactory; |
| com::sun::star::uno::Reference< |
| com::sun::star::uno::XAggregation > m_xAggProxy; |
| com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > m_xWrappedStorage; |
| com::sun::star::uno::Reference< |
| com::sun::star::embed::XTransactedObject > m_xWrappedTransObj; |
| com::sun::star::uno::Reference< |
| com::sun::star::lang::XComponent > m_xWrappedComponent; |
| com::sun::star::uno::Reference< |
| com::sun::star::lang::XTypeProvider > m_xWrappedTypeProv; |
| bool m_bIsDocumentStorage; |
| |
| StorageElementFactory::StorageMap::iterator m_aContainerIt; |
| |
| friend class StorageElementFactory; |
| friend class std::auto_ptr< Storage >; |
| }; |
| |
| //======================================================================= |
| |
| typedef |
| cppu::WeakImplHelper2< |
| com::sun::star::io::XOutputStream, |
| com::sun::star::lang::XComponent > OutputStreamUNOBase; |
| |
| class OutputStream : public OutputStreamUNOBase, public ParentStorageHolder |
| { |
| public: |
| OutputStream( |
| const com::sun::star::uno::Reference< |
| com::sun::star::lang::XMultiServiceFactory > & xSMgr, |
| const rtl::OUString & rUri, |
| const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > & xParentStorage, |
| const com::sun::star::uno::Reference< |
| com::sun::star::io::XOutputStream > & xStreamToWrap ); |
| virtual ~OutputStream(); |
| |
| // XInterface |
| virtual com::sun::star::uno::Any SAL_CALL |
| queryInterface( const com::sun::star::uno::Type& aType ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| // XTypeProvider (implemnented by base, but needs to be overridden for |
| // delegating to aggregate) |
| virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL |
| getTypes() |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL |
| getImplementationId() |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| // XOutputStream |
| virtual void SAL_CALL |
| writeBytes( const com::sun::star::uno::Sequence< sal_Int8 >& aData ) |
| throw ( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::BufferSizeExceededException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| flush( ) |
| throw ( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::BufferSizeExceededException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| // Note: We need to intercept this one. |
| virtual void SAL_CALL |
| closeOutput( ) |
| throw ( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::BufferSizeExceededException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| // XComponent |
| // Note: We need to intercept this one. |
| virtual void SAL_CALL |
| dispose() |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| addEventListener( const com::sun::star::uno::Reference< |
| com::sun::star::lang::XEventListener >& xListener ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| removeEventListener( const com::sun::star::uno::Reference< |
| com::sun::star::lang::XEventListener >& aListener ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| private: |
| com::sun::star::uno::Reference< |
| com::sun::star::uno::XAggregation > m_xAggProxy; |
| com::sun::star::uno::Reference< |
| com::sun::star::io::XOutputStream > m_xWrappedStream; |
| com::sun::star::uno::Reference< |
| com::sun::star::lang::XComponent > m_xWrappedComponent; |
| com::sun::star::uno::Reference< |
| com::sun::star::lang::XTypeProvider > m_xWrappedTypeProv; |
| }; |
| |
| //======================================================================= |
| |
| typedef cppu::WeakImplHelper5< com::sun::star::io::XStream, |
| com::sun::star::io::XOutputStream, |
| com::sun::star::io::XTruncate, |
| com::sun::star::io::XInputStream, |
| com::sun::star::lang::XComponent > |
| StreamUNOBase; |
| |
| class Stream : public StreamUNOBase, public ParentStorageHolder |
| { |
| public: |
| Stream( |
| const com::sun::star::uno::Reference< |
| com::sun::star::lang::XMultiServiceFactory > & xSMgr, |
| const rtl::OUString & rUri, |
| const com::sun::star::uno::Reference< |
| com::sun::star::embed::XStorage > & xParentStorage, |
| const com::sun::star::uno::Reference< |
| com::sun::star::io::XStream > & xStreamToWrap ); |
| |
| virtual ~Stream(); |
| |
| // XInterface |
| virtual com::sun::star::uno::Any SAL_CALL |
| queryInterface( const com::sun::star::uno::Type& aType ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| // XTypeProvider (implemnented by base, but needs to be overridden for |
| // delegating to aggregate) |
| virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL |
| getTypes() |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL |
| getImplementationId() |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| // XStream |
| virtual com::sun::star::uno::Reference< |
| com::sun::star::io::XInputStream > SAL_CALL |
| getInputStream() |
| throw( com::sun::star::uno::RuntimeException ); |
| |
| virtual com::sun::star::uno::Reference< |
| com::sun::star::io::XOutputStream > SAL_CALL |
| getOutputStream() |
| throw( com::sun::star::uno::RuntimeException ); |
| |
| // XOutputStream |
| virtual void SAL_CALL |
| writeBytes( const com::sun::star::uno::Sequence< sal_Int8 >& aData ) |
| throw( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::BufferSizeExceededException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| virtual void SAL_CALL |
| flush() |
| throw( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::BufferSizeExceededException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| virtual void SAL_CALL |
| closeOutput() |
| throw( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| // XTruncate |
| virtual void SAL_CALL |
| truncate() |
| throw( com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| // XInputStream |
| virtual sal_Int32 SAL_CALL |
| readBytes( com::sun::star::uno::Sequence< sal_Int8 >& aData, |
| sal_Int32 nBytesToRead ) |
| throw( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::BufferSizeExceededException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| virtual sal_Int32 SAL_CALL |
| readSomeBytes( com::sun::star::uno::Sequence< sal_Int8 >& aData, |
| sal_Int32 nMaxBytesToRead ) |
| throw( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::BufferSizeExceededException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException); |
| |
| virtual void SAL_CALL |
| skipBytes( sal_Int32 nBytesToSkip ) |
| throw( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::BufferSizeExceededException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| virtual sal_Int32 SAL_CALL |
| available() |
| throw( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| virtual void SAL_CALL |
| closeInput() |
| throw( com::sun::star::io::NotConnectedException, |
| com::sun::star::io::IOException, |
| com::sun::star::uno::RuntimeException ); |
| |
| // XComponent |
| // Note: We need to intercept this one. |
| virtual void SAL_CALL |
| dispose() |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| addEventListener( const com::sun::star::uno::Reference< |
| com::sun::star::lang::XEventListener >& xListener ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| virtual void SAL_CALL |
| removeEventListener( const com::sun::star::uno::Reference< |
| com::sun::star::lang::XEventListener >& aListener ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| private: |
| void commitChanges() |
| throw( com::sun::star::io::IOException ); |
| |
| com::sun::star::uno::Reference< |
| com::sun::star::uno::XAggregation > m_xAggProxy; |
| com::sun::star::uno::Reference< |
| com::sun::star::io::XStream > m_xWrappedStream; |
| com::sun::star::uno::Reference< |
| com::sun::star::io::XOutputStream > m_xWrappedOutputStream; |
| com::sun::star::uno::Reference< |
| com::sun::star::io::XTruncate > m_xWrappedTruncate; |
| com::sun::star::uno::Reference< |
| com::sun::star::io::XInputStream > m_xWrappedInputStream; |
| com::sun::star::uno::Reference< |
| com::sun::star::lang::XComponent > m_xWrappedComponent; |
| com::sun::star::uno::Reference< |
| com::sun::star::lang::XTypeProvider > m_xWrappedTypeProv; |
| }; |
| |
| } // namespace tdoc_ucp |
| |
| #endif /* !INCLUDED_TDOC_STGELEMS_HXX */ |