diff options
Diffstat (limited to 'include/sot/stg.hxx')
-rw-r--r-- | include/sot/stg.hxx | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/include/sot/stg.hxx b/include/sot/stg.hxx new file mode 100644 index 0000000000..72003f08fd --- /dev/null +++ b/include/sot/stg.hxx @@ -0,0 +1,317 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#ifndef INCLUDED_SOT_STG_HXX +#define INCLUDED_SOT_STG_HXX + +#include <tools/stream.hxx> +#include <tools/globname.hxx> +#include <sot/storinfo.hxx> +#include <sot/sotdllapi.h> +#include <config_options.h> + +namespace com::sun::star::ucb { class XProgressHandler; } +namespace com::sun::star::uno { class Any; } +namespace com::sun::star::uno { template <typename > class Reference; } + +class StgIo; +class StgDirEntry; +typedef struct SvGUID ClsId; + +class StorageBase : public SvRefBase +{ +protected: + mutable ErrCode m_nError; // error code + StreamMode m_nMode; // open mode + bool m_bAutoCommit; + StorageBase(); + virtual ~StorageBase() override; +public: + virtual bool Validate( bool=false ) const = 0; + virtual bool ValidateMode( StreamMode ) const = 0; + void ResetError() const; + void SetError( ErrCode ) const; + ErrCode GetError() const; + bool Good() const { return m_nError == ERRCODE_NONE; } + StreamMode GetMode() const { return m_nMode; } + void SetAutoCommit( bool bSet ) + { m_bAutoCommit = bSet; } +}; + +class BaseStorageStream : public StorageBase +{ +public: + virtual sal_Int32 Read( void * pData, sal_Int32 nSize ) = 0; + virtual sal_Int32 Write( const void* pData, sal_Int32 nSize ) = 0; + virtual sal_uInt64 Seek( sal_uInt64 nPos ) = 0; + virtual sal_uInt64 Tell() = 0; + virtual void Flush() = 0; + virtual bool SetSize( sal_uInt64 nNewSize ) = 0; + virtual sal_uInt64 GetSize() const = 0; + virtual void CopyTo( BaseStorageStream * pDestStm ) = 0; + virtual bool Commit() = 0; + virtual bool Equals( const BaseStorageStream& rStream ) const = 0; +}; + +enum class SotClipboardFormatId : sal_uInt32; + +class SAL_DLLPUBLIC_RTTI BaseStorage : public StorageBase +{ +public: + virtual const OUString& GetName() const = 0; + virtual bool IsRoot() const = 0; + virtual void SetClassId( const ClsId& ) = 0; + virtual const ClsId& GetClassId() const = 0; + virtual void SetDirty() = 0; + virtual void SetClass( const SvGlobalName & rClass, + SotClipboardFormatId nOriginalClipFormat, + const OUString & rUserTypeName ) = 0; + virtual SvGlobalName GetClassName() = 0; + virtual SotClipboardFormatId GetFormat() = 0; + virtual OUString GetUserName() = 0; + virtual void FillInfoList( SvStorageInfoList* ) const = 0; + virtual bool CopyTo( BaseStorage* pDestStg ) const = 0; + virtual bool Commit() = 0; + virtual bool Revert() = 0; + virtual BaseStorageStream* OpenStream( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = true ) = 0; + virtual BaseStorage* OpenStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) = 0; + virtual BaseStorage* OpenUCBStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) = 0; + virtual BaseStorage* OpenOLEStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) = 0; + virtual bool IsStream( const OUString& rEleName ) const = 0; + virtual bool IsStorage( const OUString& rEleName ) const = 0; + virtual bool IsContained( const OUString& rEleName ) const = 0; + virtual void Remove( const OUString & rEleName ) = 0; + virtual bool CopyTo( const OUString & rEleName, BaseStorage * pDest, const OUString & rNewName ) = 0; + virtual bool ValidateFAT() = 0; + virtual bool Equals( const BaseStorage& rStream ) const = 0; +}; + +class OLEStorageBase +{ +protected: + StreamMode& nStreamMode; // open mode + StgIo* pIo; // I/O subsystem + StgDirEntry* pEntry; // the dir entry + OLEStorageBase( StgIo*, StgDirEntry*, StreamMode& ); + ~OLEStorageBase(); + bool Validate_Impl( bool ) const; + static bool ValidateMode_Impl( StreamMode, StgDirEntry const * p = nullptr ); +}; + +class StorageStream final : public BaseStorageStream, public OLEStorageBase +{ +//friend class Storage; + sal_uInt64 nPos; // current position + + virtual ~StorageStream() override; +public: + StorageStream( StgIo*, StgDirEntry*, StreamMode ); + virtual sal_Int32 Read( void * pData, sal_Int32 nSize ) override; + virtual sal_Int32 Write( const void* pData, sal_Int32 nSize ) override; + virtual sal_uInt64 Seek( sal_uInt64 nPos ) override; + virtual sal_uInt64 Tell() override { return nPos; } + virtual void Flush() override; + virtual bool SetSize( sal_uInt64 nNewSize ) override; + virtual sal_uInt64 GetSize() const override; + virtual void CopyTo( BaseStorageStream * pDestStm ) override; + virtual bool Commit() final override; + virtual bool Validate( bool=false ) const override; + virtual bool ValidateMode( StreamMode ) const override; + virtual bool Equals( const BaseStorageStream& rStream ) const override; +}; + +class UCBStorageStream; + +class UNLESS_MERGELIBS(SOT_DLLPUBLIC) Storage final : public BaseStorage, public OLEStorageBase +{ + OUString aName; + bool bIsRoot; + void Init( bool bCreate ); + Storage( StgIo*, StgDirEntry*, StreamMode ); + virtual ~Storage() override; +public: + Storage( OUString, StreamMode, bool bDirect ); + Storage( SvStream& rStrm, bool bDirect ); + Storage( UCBStorageStream& rStrm, bool bDirect ); + + static bool IsStorageFile( const OUString & rFileName ); + static bool IsStorageFile( SvStream* ); + + virtual const OUString& GetName() const final override; + virtual bool IsRoot() const override { return bIsRoot; } + virtual void SetClassId( const ClsId& ) override; + virtual const ClsId& GetClassId() const override; + virtual void SetDirty() override; + virtual void SetClass( const SvGlobalName & rClass, + SotClipboardFormatId nOriginalClipFormat, + const OUString & rUserTypeName ) override; + virtual SvGlobalName GetClassName() override; + virtual SotClipboardFormatId GetFormat() override; + virtual OUString GetUserName() override; + virtual void FillInfoList( SvStorageInfoList* ) const override; + virtual bool CopyTo( BaseStorage* pDestStg ) const override; + virtual bool Commit() final override; + virtual bool Revert() override; + virtual BaseStorageStream* OpenStream( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = true ) override; + virtual BaseStorage* OpenStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) override; + virtual BaseStorage* OpenUCBStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) override; + virtual BaseStorage* OpenOLEStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) override; + virtual bool IsStream( const OUString& rEleName ) const override; + virtual bool IsStorage( const OUString& rEleName ) const override; + virtual bool IsContained( const OUString& rEleName ) const override; + virtual void Remove( const OUString & rEleName ) override; + virtual bool CopyTo( const OUString & rEleName, BaseStorage * pDest, const OUString & rNewName ) override; + virtual bool ValidateFAT() override; + virtual bool Validate( bool=false ) const override; + virtual bool ValidateMode( StreamMode ) const override; + bool ValidateMode( StreamMode, StgDirEntry const * p ) const; + virtual bool Equals( const BaseStorage& rStream ) const override; +}; + +class UCBStorageStream_Impl; +class UCBStorageStream final : public BaseStorageStream +{ +friend class UCBStorage; + + UCBStorageStream_Impl* + pImp; + virtual ~UCBStorageStream() override; +public: + UCBStorageStream( const OUString& rName, StreamMode nMode, bool bDirect, bool bRepair, css::uno::Reference< css::ucb::XProgressHandler > const & xProgress ); + UCBStorageStream( UCBStorageStream_Impl* ); + + virtual sal_Int32 Read( void * pData, sal_Int32 nSize ) override; + virtual sal_Int32 Write( const void* pData, sal_Int32 nSize ) override; + virtual sal_uInt64 Seek( sal_uInt64 nPos ) override; + virtual sal_uInt64 Tell() override; + virtual void Flush() override; + virtual bool SetSize( sal_uInt64 nNewSize ) override; + virtual sal_uInt64 GetSize() const override; + virtual void CopyTo( BaseStorageStream * pDestStm ) override; + virtual bool Commit() override; + virtual bool Validate( bool=false ) const override; + virtual bool ValidateMode( StreamMode ) const override; + virtual bool Equals( const BaseStorageStream& rStream ) const override; + bool SetProperty( const OUString& rName, const css::uno::Any& rValue ); + + SvStream* GetModifySvStream(); +}; + +namespace ucbhelper +{ + class Content; +} + +class UCBStorage_Impl; +struct UCBStorageElement_Impl; +class SOT_DLLPUBLIC UCBStorage final : public BaseStorage +{ + UCBStorage_Impl* pImp; + + virtual ~UCBStorage() override; +public: + static bool IsStorageFile( SvStream* ); + + UCBStorage( const ::ucbhelper::Content& rContent, + const OUString& rName, + StreamMode nMode, + bool bDirect, + bool bIsRoot ); + + UCBStorage( const OUString& rName, + StreamMode nMode, + bool bDirect, + bool bIsRoot ); + + UCBStorage( const OUString& rName, + StreamMode nMode, + bool bDirect, + bool bIsRoot, + bool bIsRepair, + css::uno::Reference< css::ucb::XProgressHandler > const & + xProgressHandler ); + + UCBStorage( UCBStorage_Impl* ); + + UCBStorage( SvStream& rStrm, bool bDirect ); + + virtual const OUString& GetName() const override; + virtual bool IsRoot() const override; + virtual void SetClassId( const ClsId& ) override; + virtual const ClsId& GetClassId() const override; + virtual void SetDirty() override; + virtual void SetClass( const SvGlobalName & rClass, + SotClipboardFormatId nOriginalClipFormat, + const OUString & rUserTypeName ) override; + virtual SvGlobalName GetClassName() override; + virtual SotClipboardFormatId GetFormat() override; + virtual OUString GetUserName() override; + virtual void FillInfoList( SvStorageInfoList* ) const override; + virtual bool CopyTo( BaseStorage* pDestStg ) const override; + virtual bool Commit() final override; + virtual bool Revert() override; + virtual BaseStorageStream* OpenStream( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = true ) override; + virtual BaseStorage* OpenStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) override; + virtual BaseStorage* OpenUCBStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) override; + virtual BaseStorage* OpenOLEStorage( const OUString & rEleName, + StreamMode = StreamMode::STD_READWRITE, + bool bDirect = false ) override; + virtual bool IsStream( const OUString& rEleName ) const override; + virtual bool IsStorage( const OUString& rEleName ) const override; + virtual bool IsContained( const OUString& rEleName ) const override; + virtual void Remove( const OUString & rEleName ) override; + virtual bool CopyTo( const OUString & rEleName, BaseStorage * pDest, const OUString & rNewName ) override; + virtual bool ValidateFAT() override; + virtual bool Validate( bool=false ) const override; + virtual bool ValidateMode( StreamMode ) const override; + virtual bool Equals( const BaseStorage& rStream ) const override; + + UCBStorageElement_Impl* FindElement_Impl( std::u16string_view rName ) const; + bool CopyStorageElement_Impl( UCBStorageElement_Impl const & rElement, + BaseStorage* pDest, const OUString& rNew ) const; + BaseStorage* OpenStorage_Impl( const OUString & rEleName, + StreamMode, bool bDirect, bool bForceUCBStorage ); + +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |